日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android自定义view之九宫格解锁

發(fā)布時間:2023/12/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android自定义view之九宫格解锁 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

android自定義view之九宮格解鎖

更多細節(jié)請看源碼
https://github.com/que123567/lockview

  • 1. 定義一個類作為九宮格的格子

    包含坐標和索引(用來記錄密碼)
    point含三種狀態(tài)分別對應三種不同情況下點的圖片樣式

package lockview;/*** Created by smaug on 2017/5/11.*/public class Point {public float x;public float y;private int index;public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}public static final int STATU_NORNAL = 0;public static final int STATU_PRESSED = 1;public static final int STATU_ERROR = 2;public int state;public void setState(int state) {this.state = state;}public int getState() {return state;}public Point() {super();}public Point(float x, float y) {this.x = x;this.y = y;}public float getX() {return x;}public void setX(float x) {this.x = x;}public float getY() {return y;}public void setY(float y) {this.y = y;} }
  • 2.新建類LockView繼承自View
    重寫onDraw()方法
    • 初始化點的時候根據(jù)獲取當前屏幕的寬高,比對來確定當前狀態(tài)是橫屏還是豎屏
    • 從資源中獲取Bitmap,將點設置成圖像。
@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);initPoints();initPaint(); }private void drawPoints(Canvas canvas) {for (int i = 0; i < points.length; i++) {for (int j = 0; j < points[i].length; j++) {Point point = points[i][j];if (point.getState() == Point.STATU_NORNAL) {//獲取當前點的坐標,減去圖片的半徑得到left和top的坐標點canvas.drawBitmap(point_normal, point.x - br, point.y - br, null);} else if (point.getState() == Point.STATU_PRESSED) {canvas.drawBitmap(point_pressed, point.x - br, point.y - br, null);} else if (point.getState() == Point.STATU_ERROR) {canvas.drawBitmap(point_error, point.x - br, point.y - br, null);}}}}public class LockView extends View {private void initPoints() {width = getWidth();height = getHeight();if (height > width) {//豎屏offsetY = (height - width) / 2;height = width;} else { //橫屏offsetX = (height - width) / 2;width = height;}/*** 定義9個點的坐標*/points = new Point[row][colun];int index = 1;for (int i = 0; i < row; i++) {for (int j = 0; j < colun; j++) {points[i][j] = new Point(offsetX + (width / (row + 1)) * (i + 1), offsetY +(width / (colun + 1)) * (j + 1));points[i][j].setIndex(index);index++;}}/*** 從資源中獲取Bitmap*/point_normal = BitmapFactory.decodeResource(getResources(), R.drawable.point_normal);point_pressed = BitmapFactory.decodeResource(getResources(), R.drawable.point_pressed);point_error = BitmapFactory.decodeResource(getResources(), R.drawable.point_error);br = point_normal.getWidth() / 2;} }

顯示結果如下圖

  • 3.重寫onTouchEvent
case MotionEvent.ACTION_DOWN:reset();//先清空之前繪制的狀態(tài)checkedPoint = checkPoint(eventX, eventY, br);if (checkedPoint != null) {isSelecte = true;checkedPoint.setState(Point.STATU_PRESSED);}break;

checkPoint()通過計算坐標距離判斷當前手指坐標是否在point圖片上

private Point checkPoint(float eventX, float eventY, float br) {for (int i = 0; i < points.length; i++) {for (int j = 0; j < points[i].length; j++) {Point point = points[i][j];double distance = getDistance(point.x, point.y, eventX, eventY);if (distance < br) {return point;}}}return null;}

getDistance()利用勾股定理計算坐標距離

private double getDistance(float x, float y, float eventX, float eventY) {return Math.sqrt(Math.abs(x - eventX) * Math.abs(x - eventX) + Math.abs(y - eventY) *Math.abs(y - eventY));}

這個時候手指接觸都某個點,某個點的狀態(tài)就會從normal轉(zhuǎn)換為pressed,其對應的圖片也會改變。

  • 4.添加點與點之間的連線
    LockView中定義一個Point類的List —>pointList 記錄用戶按下的點

  • 當pointList為空,即用戶未按下任一點的時候不繪制線段,其余時刻都繪制

  • 繪制線段調(diào)用canvas的drawLine()方法,傳入起始點x,y坐標與目標點x,y坐標與一個自定義的paint畫筆繪制線段

private void drawLine(Canvas canvas) {if (pointList.size() > 0) {Point a = pointList.get(0);for (int i = 1; i < pointList.size(); i++) {Point b = pointList.get(i);canvas.drawLine(a.x, a.y, b.x, b.y, paint);a = b;}if (!moveOnPoint) { //canvas.drawLine(a.x, a.y, eventX, eventY, paint);}}}

效果如圖所示

  • 5.自動連接中間點

在九宮格中,如果用戶跳開中間點只連接了頭尾兩個點,按照規(guī)則應該把中間點自動連上。

即在ACTION_MOVE過程中始終判斷中間點是否被連入,而中間點的判斷方式為首尾點坐標/2.

case MotionEvent.ACTION_MOVE:if (isSelecte) {checkedPoint = checkPoint(eventX, eventY, br);if (checkedPoint != null) {if (!pointList.contains(checkedPoint)) {middlePoint = checkPoint((checkedPoint.x + lastPoint.x) / 2, (checkedPoint.y + lastPoint.y) / 2, br);if (middlePoint != null) {middlePoint.setState(Point.STATU_PRESSED);}}checkedPoint.setState(Point.STATU_PRESSED);moveOnPoint = true;} else {moveOnPoint = false;}}break;
  • 6.此外,在繪制過程中會記錄密碼,在使用該LockView時可設置setOnLockSuccessed監(jiān)聽來判斷,其中帶有參數(shù):正確密碼-passward

    對應的,連接數(shù)少于5判定為連接失敗,也有對應的監(jiān)聽事件。

if (pointList != null) {if (pointList.size() == 1) {reset();//重置} else if (pointList.size() < 5) {//個數(shù)不足errorPoint();//繪制錯誤的圖案if (onLockChangeListener != null) { //失敗onLockChangeListener.setOnLockError();}} else if (pointList.size() >= 5) { //九宮格連接數(shù)應大于等于5StringBuilder passward = new StringBuilder();for (int i = 0; i < pointList.size(); i++) {int tmpIndex = pointList.get(i).getIndex();passward.append(tmpIndex + "");}if (onLockChangeListener != null)//成功onLockChangeListener.setOnLockSuccessed(passward);}}

作者:邱鐘浩:原文地址

總結

以上是生活随笔為你收集整理的android自定义view之九宫格解锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 啪一啪在线| 欧美撒尿777hd撒尿 | 2024男人天堂| 花房姑娘免费观看全集 | 成人午夜影院在线观看 | 久久精品一区二区免费播放 | 国产欧美日韩激情 | 亚洲人成人一区二区在线观看 | 日韩毛片免费看 | 亚洲激情视频网站 | 极品探花在线观看 | 99在线观看免费 | 伊人春色视频 | 日韩人妻精品无码一区二区三区 | 国产av天堂无码一区二区三区 | 欧美一级二级在线观看 | av动漫免费看 | xxx日本黄色 | 日日日日日日bbbbbb | 一级α片免费看刺激高潮视频 | 亚洲天堂黄 | 中文字幕 日韩 欧美 | 精品久久久无码中文字幕边打电话 | av鲁丝一区鲁丝二区鲁丝三区 | 在线观看免费av网站 | 日本国产亚洲 | 黑人巨大精品人妻一区二区 | 秘密基地在线观看完整版免费 | 日韩精品一区二区三区四区 | 一二区精品 | 懂色av一区二区三区在线播放 | 好吊妞视频在线观看 | 国产h片在线观看 | 国产成人精品免高潮费视频 | 国产一区二区三区91 | 国产精品69久久久久孕妇欧美 | 日本一区二区免费视频 | 18pao国产成视频永久免费 | 日韩中文字幕亚洲精品欧美 | 亚洲熟妇av一区二区三区 | 亚洲在线看 | 日本丰满熟妇bbxbbxhd | 福利在线播放 | 艳妇乳肉豪妇荡乳av | 91成人在线观看喷潮动漫 | 冲田杏梨一区二区三区 | 免费高清欧美大片在线观看 | 欧美另类日韩 | 国产成人tv | 亚洲三级伦理 | 国产一区二区三区小说 | 成年人黄色免费网站 | 国产手机av在线 | 国产精品蜜臀 | 黄色一级片免费在线观看 | 成人小视频在线观看 | 日本高清视频网站 | 国产我不卡 | 天堂网一区二区 | 天天综合色 | 星空大象在线观看免费播放 | 国产999久久久| 国产精品178页 | 日韩精品一区二区三区高清免费 | 富二代成人短视频 | 国产精品无码一区二区三区免费 | 中文字幕少妇在线三级hd | 亚洲系列在线观看 | 视频这里只有精品 | 国产传媒视频 | 麻豆天天躁天天揉揉av | 午夜亚洲aⅴ无码高潮片苍井空 | 午夜视频在线网站 | 玖草影院 | 欧美日韩黄色一区二区 | www.青青草.com| 波多野结衣在线观看视频 | 成年人看的黄色 | 摸丰满大乳奶水www免费 | 精品国产91久久久久久 | 亚洲人在线 | 怡红院一区二区三区 | 国产精品无码专区 | 免费荫蒂添的好舒服视频 | 日韩精品免费播放 | 国产又粗又猛又黄视频 | 国产小视频91 | 国产又色又爽无遮挡免费动态图 | 国产精品久久久久久亚洲调教 | 久久精品中文字幕 | 中文字幕欧美在线 | 色婷婷综合视频 | 人人澡超碰碰 | 2020av视频 | 亚洲国产精品无码专区 | 久久一精品| 日韩大片在线观看 | 91久久久久久 | 欧美中文字幕在线 |