android 仿ios數(shù)字密碼解鎖界面的實(shí)例
如下所示:

每個(gè)Android開(kāi)發(fā)人員都知道,現(xiàn)在android的解鎖最常用的就是九宮格解鎖,ios的解鎖常用的是數(shù)字密碼解鎖。而我們?cè)陂_(kāi)發(fā)工程中,很多時(shí)候,都需要android和ios進(jìn)行結(jié)合。有的時(shí)候我們就需要把我們的解鎖界面弄成像ios一樣的數(shù)字鍵盤(pán)。
這里我就實(shí)現(xiàn)了一個(gè)仿照ios的數(shù)字密碼解鎖界面。在這里我采用了兩種方式來(lái)實(shí)現(xiàn),第一種就是使用自定義控件的形式,第二種就是使用我們的布局來(lái)實(shí)現(xiàn)的。這里我就著重講一下使用自定義控件形式實(shí)現(xiàn)的思路。至于使用布局文件實(shí)現(xiàn)的方式,我就不進(jìn)行具體的講解了,具體的在后面我會(huì)上傳源碼供大家下載進(jìn)行研究學(xué)習(xí)。
當(dāng)然,我的能力有限,可能你們覺(jué)得我的方式不好,那么你們就給我提出來(lái),看看具體你們覺(jué)得怎么實(shí)現(xiàn)才好,我們一起研究學(xué)習(xí)。
好了,廢話不多說(shuō)了,現(xiàn)在就來(lái)講解一下,我所使用自定義控件的實(shí)現(xiàn)方法:
1.最主要還是實(shí)現(xiàn)自定義數(shù)字鍵盤(pán)(一個(gè)自定義View的控件):
1.繪制數(shù)字
// 繪制第一排1,2,3
canvas.drawText("1", first_x, 40 + first_y, paint);
canvas.drawText("2", first_x * 2, 40 + first_y, paint);
canvas.drawText("3", first_x * 3, 40 + first_y, paint);
// 繪制第2排4,5,6
canvas.drawText("4", first_x, 40 + first_y + first_x, paint);
canvas.drawText("5", first_x * 2, 40 + first_y + first_x, paint);
canvas.drawText("6", first_x * 3, 40 + first_y + first_x, paint);
// 繪制第3排7,8,9
canvas.drawText("7", first_x, 40 + first_y + first_x * 2, paint);
canvas.drawText("8", first_x * 2, 40 + first_y + first_x * 2, paint);
canvas.drawText("9", first_x * 3, 40 + first_y + first_x * 2, paint);
// 繪制第4排0
canvas.drawText("0", first_x * 2, 40 + first_y + first_x * 3, paint);
2.繪制好數(shù)字后,我們需要在每一個(gè)數(shù)字外面添加一層圓,繪制圓
//依次繪制第一排的圓 canvas.drawCircle(first_x+10, 40 + first_y - 15, 50, paint); canvas.drawCircle(first_x*2+10, 40 + first_y - 15, 50, paint); canvas.drawCircle(first_x*3+10, 40 + first_y - 15, 50, paint); //依次繪制第2排的圓 canvas.drawCircle(first_x+10, 40 + first_y + first_x - 15, 50, paint); canvas.drawCircle(first_x*2+10, 40 + first_y + first_x - 15, 50, paint); canvas.drawCircle(first_x*3+10, 40 + first_y + first_x - 15, 50, paint); //依次繪制第3排的圓 canvas.drawCircle(first_x+10, 40 + first_y + first_x * 2 - 15, 50, paint); canvas.drawCircle(first_x*2+10, 40 + first_y + first_x * 2 - 15, 50, paint); canvas.drawCircle(first_x*3+10, 40 + first_y + first_x * 2 - 15, 50, paint); //繪制最后一個(gè)圓 canvas.drawCircle(first_x*2+10, 40 + first_y + first_x * 3 - 15, 50, paint);
3.點(diǎn)擊數(shù)字后,我們給一個(gè)不同的效果,讓用戶(hù)知道自己點(diǎn)擊了該數(shù)字,這里我是吧外面的圓的顏色改為了黃色
//判斷是否點(diǎn)擊數(shù)字
if(circle_x > 0 && circle_y > 0){//點(diǎn)擊
if(type == 0){//按下刷新
paint.setColor(Color.YELLOW);//設(shè)置畫(huà)筆顏色
canvas.drawCircle(circle_x, circle_y, 50, paint);//繪制圓
}else if(type == 1){//彈起刷新
paint.setColor(Color.WHITE);//設(shè)置畫(huà)筆顏色
canvas.drawCircle(circle_x, circle_y, 50, paint);//繪制圓
//繪制完成后,重置
circle_x = 0; circle_y = 0;
}
}
4.最后就是判斷點(diǎn)擊的數(shù)字
/*
* 判斷點(diǎn)擊的是哪一個(gè)數(shù)字圓
*/
private void handleDown(float x, float y){
//判斷點(diǎn)擊的是那一列的數(shù)據(jù)
if(xs[0] - 50 <= x && x <= xs[0] + 50){//第一列
//獲取點(diǎn)擊處的圓心橫坐標(biāo)
circle_x = xs[0];
//判斷點(diǎn)擊的是哪一排
if(ys[0] - 50 <= y && ys[0] + 50 >= y){//第1排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[0];
number = 1;//設(shè)置點(diǎn)擊的數(shù)字
}else if(ys[1] - 50 <= y && ys[1] + 50 >= y){//第2排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[1];
number = 4;//設(shè)置點(diǎn)擊的數(shù)字
}else if(ys[2] - 50 <= y && ys[2] + 50 >= y){//第3排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[2];
number = 7;//設(shè)置點(diǎn)擊的數(shù)字
}
}else if(xs[1] - 50 <= x && x <= xs[1] + 50){//第2列
//獲取點(diǎn)擊處的圓心橫坐標(biāo)
circle_x = xs[1];
//判斷點(diǎn)擊的是哪一排
if(ys[0] - 50 <= y && ys[0] + 50 >= y){//第1排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[0];
number = 2;//設(shè)置點(diǎn)擊的數(shù)字
}else if(ys[1] - 50 <= y && ys[1] + 50 >= y){//第2排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[1];
number = 5;//設(shè)置點(diǎn)擊的數(shù)字
}else if(ys[2] - 50 <= y && ys[2] + 50 >= y){//第3排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[2];
number = 8;//設(shè)置點(diǎn)擊的數(shù)字
}else if(ys[3] - 50 <= y && ys[3] + 50 >= y){//第4排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[3];
number = 0;//設(shè)置點(diǎn)擊的數(shù)字
}
}else if(xs[2] - 50 <= x && x <= xs[2] + 50){//第3列
//獲取點(diǎn)擊處的圓心橫坐標(biāo)
circle_x = xs[2];
//判斷點(diǎn)擊的是哪一排
if(ys[0] - 50 <= y && ys[0] + 50 >= y){//第1排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[0];
number = 3;//設(shè)置點(diǎn)擊的數(shù)字
}else if(ys[1] - 50 <= y && ys[1] + 50 >= y){//第2排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[1];
number = 6;//設(shè)置點(diǎn)擊的數(shù)字
}else if(ys[2] - 50 <= y && ys[2] + 50 >= y){//第3排
//獲取點(diǎn)擊的數(shù)字圓的圓心縱坐標(biāo)
circle_y = ys[2];
number = 9;//設(shè)置點(diǎn)擊的數(shù)字
}
}
sendAccessEvent(R.string.numeric_keyboard_down);
type = 0;//按下刷新
//繪制點(diǎn)擊時(shí)的背景圓
invalidate();
}
好了,大概我的就是這樣了。順帶提一下,我這里上面4個(gè)顯示密碼的控件也是采用的自定義控件的方式,使用線程實(shí)現(xiàn)輸入數(shù)字后1秒后用密碼字符替換輸入的數(shù)字。(有人可能會(huì)說(shuō)系統(tǒng)的EditText控件設(shè)置樣式為密碼也可以實(shí)現(xiàn),這里我想說(shuō)的是,不可以的,至少我試了是不行的)
以上這篇android 仿ios數(shù)字密碼解鎖界面的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義view仿QQ的Tab按鈕動(dòng)畫(huà)效果(示例代碼)
這篇文章主要介紹了Android自定義view仿QQ的Tab按鈕動(dòng)畫(huà)效果(示例代碼),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考價(jià)值,需要的朋友可以參考下2021-01-01
Flutter之Timer實(shí)現(xiàn)短信驗(yàn)證碼獲取60s倒計(jì)時(shí)功能的代碼
這篇文章主要介紹了Flutter之Timer實(shí)現(xiàn)短信驗(yàn)證碼獲取60s倒計(jì)時(shí)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Android獲取熱點(diǎn)主機(jī)ip和連接熱點(diǎn)手機(jī)ip的代碼
這篇文章主要介紹了Android獲取熱點(diǎn)主機(jī)ip和連接熱點(diǎn)手機(jī)ip的相關(guān)資料,需要的朋友可以參考下2018-01-01
mac開(kāi)發(fā)android環(huán)境搭建步驟圖解
這里比較詳細(xì)的來(lái)總結(jié)下mac開(kāi)發(fā)android的環(huán)境搭建步驟安裝過(guò)程,希望對(duì)一些正準(zhǔn)備配置Android開(kāi)發(fā)環(huán)境的小伙伴們有一定幫助2014-01-01
Android中使用TextView實(shí)現(xiàn)文字跑馬燈效果
本文主要介紹了Android中使用TextView實(shí)現(xiàn)文字走馬燈效果的方法解析。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
21天學(xué)習(xí)android開(kāi)發(fā)教程之SurfaceView
21天學(xué)習(xí)android開(kāi)發(fā)教程之SurfaceView,SurfaceView由于可以直接從內(nèi)存或者DMA等硬件接口取得圖像數(shù)據(jù),因此是個(gè)非常重要的繪圖容器,操作相對(duì)簡(jiǎn)單,感興趣的小伙伴們可以參考一下2016-02-02
Android Studio+MAT實(shí)戰(zhàn)內(nèi)存泄漏
這篇文章主要介紹了Android Studio+MAT實(shí)戰(zhàn)內(nèi)存泄漏的相關(guān)技術(shù)內(nèi)容,并在需要注意的地方做了提示,需要參考學(xué)習(xí)下吧。2017-12-12

