项目可能的需要,自己尝试写了一个九宫格解锁,在此记录,以作笔记。

先上效果图

                   

关于项目的分析,见下图

width 九宫格控件的宽度,height 九宫格的控件的高度,offsetX是x轴的偏移量,offsetY是y轴的偏移量(实际编写的时候一般根据宽高的数值取小的居中显示,所以 offsetX与offsetY 根据宽高有一个数值会为 0 ),将控件中间区域分为 4X4 的数组区域,step为方格的大小,数组坐标与数组【1,2,3,4,5,6,7,8,9】的对应关系对应如图(根据需要可以把 1-9 改为字母或者特殊字符的对应关系),计算公时为 坐标 ( i , j ) 对应的数字  number = i +( j - 1)*3.

手势在移动的时候感觉触摸的坐标判断是否连接到对应的点。

九宫格控件 NineLockView

public class NineLockView extends View {private Paint paint;private boolean isInit=true;//是否初始化private boolean isDrawEnd=false;//是否画最后的点与触摸点之间的线private int offsetX;//x轴偏移量private int offsetY;//y轴偏移量private int step;//节点间的距离private int radius=40;//节点圆圈的半径大小private int lastPointX;//最后一个节点的 x 坐标private int lastPointY;//最后一个节点的 y 坐标private float linearEndX;//触摸点的最终位置坐标private float linearEndY;private List<Point> code=new ArrayList<Point>();//选中点的集合private NineLockListener lockListener;public NineLockView(Context context,@Nullable AttributeSet attrs) {super(context, attrs);init();}private void init(){paint=new Paint();paint.setColor(Color.parseColor("#458264"));paint.setAntiAlias(true);paint.setStrokeWidth(1);paint.setStrokeJoin(Paint.Join.ROUND);paint.setStrokeCap(Paint.Cap.ROUND);}public void setLockListener(NineLockListener lockListener) {this.lockListener = lockListener;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if(isInit){isInit=false;int w=getWidth();int h=getHeight();if(w>h){offsetX=(w-h)/2;w=h;}else {offsetY=(h-w)/2;h=w;}step=w/4;code.clear();lastPointY=0;lastPointX=0;}for(int i=1;i<4;i++){for(int j=1;j<4;j++){canvas.drawCircle(offsetX+step*i,offsetY+step*j,radius,paint);}}paint.setStrokeWidth(8);//设置连线的宽度if(code.size()>=1){for(int i=1;i<code.size();i++){canvas.drawLine(code.get(i-1).x*step+offsetX,code.get(i-1).y*step+offsetY,code.get(i).x*step+offsetX,code.get(i).y*step+offsetY,paint);}lastPointX=code.get(code.size()-1).x*step+offsetX;lastPointY=code.get(code.size()-1).y*step+offsetY;}if(isDrawEnd && lastPointX!=0 && lastPointY!=0 && linearEndX > 9 && linearEndY>9){canvas.drawLine(lastPointX,lastPointY,linearEndX,linearEndY,paint);}}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()){case MotionEvent.ACTION_DOWN:isInit=true;isDrawEnd=true;invalidate();standLinear(event.getX(),event.getY());break;case MotionEvent.ACTION_MOVE:standLinear(event.getX(),event.getY());break;case MotionEvent.ACTION_UP:isDrawEnd=false;setResultCode();invalidate();break;}return super.onTouchEvent(event);}/*** 根据手的滑动判断是否选中某个节点* 当触摸点与节点值之间的距离小于 radius 时默认选中* @param x* @param y*/private void standLinear(float x,float y){boolean isStand=false;for(int i=1;i<4;i++){for(int j=1;j<4;j++){float tx=offsetX+step*i-x;float ty=offsetY+step*j-y;if(Math.sqrt(tx*tx+ty*ty)<=radius){isStand=true;if(code.size()==0){linearEndX=i;linearEndY=j;code.add(new Point(i,j));}else {Point last=code.get(code.size() - 1);//如果当前点与记录的最后一个点重复,则不再重复添加if (last.x == i && last.y == j) {linearEndX = x;linearEndY = y;} else {//添加记录点,如果在竖直或水平方向上中间间隔一个点则间隔的点也要加上//未考虑对角线间隔的情况if(i==last.x && j==last.y+2){code.add(new Point(i,j-1));}else if(i==last.x && j==last.y-2){code.add(new Point(i,j+1));}else if(j==last.y && i==last.x+2){code.add(new Point(i-1,j));}else if(j==last.y && i==last.x-2){code.add(new Point(i+1,j));}code.add(new Point(i,j));}}break;}}if(isStand){break;}}if(!isStand){linearEndX=x;linearEndY=y;}invalidate();}private void setResultCode(){if(lockListener!=null){if(code.size()==0){lockListener.onError();}else {int[] result = new int[code.size()];for (int i = 0; i < code.size(); i++) {result[i] = (code.get(i).y - 1 )* 3 + code.get(i).x;}lockListener.onLockResult(result);}}}}

以上代码是九宫格以及连线的自定义控件的代码

源码 码云中国 git 下载:九宫格代码下载

android 九宫格图案解锁相关推荐

  1. java实现九宫格解锁_轻松实现Android自定义九宫格图案解锁

    Android实现九宫格图案解锁,自带将图案转化成数字密码的功能,代码如下: LockPatternView.java package com.jackie.lockpattern; import a ...

  2. Android实现九宫格图案解锁

    Android实现九宫格图案解锁 前言:自定义了一个九宫格的VIew来绘制九宫格图案,实现了绘制图案解锁的功能. 效果图如下: 1. 第一步 自定义九宫格View. public class Lock ...

  3. 九宫锁屏图案有多少种c语言编程,手机九宫格图案解锁问题,编程高手戳进来!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 数学吧里看到的一个有趣问题,题目描述很简单: 求手机九宫格图案解锁一共有多少种答案.规则大家应该都知道,至少连四个点,最多连九个点,一条直线上的三个点只有 ...

  4. 用C语言计算手机的九宫格图案解锁总共能绘出多少种图案

    之前在学校的一个社团招募大一新生时,给出了这个题目: 用程序编写完成九宫格图案解锁总共能绘出多少种图案 需要满足的要求有: 1.至少经过四个点: 2.不能重复经过同一个点: 3.路径上的中间点不能跳过 ...

  5. Android中图案解锁的设计原理和实现过程

    Android中图案解锁 首先要理解图案的实现原理,上一张图:       由上图,可以看出,图案中手势的记录是1-9或0-8的,保存的顺序就是密码,当然有些是可以重复的,为了安全,肯定不能直接存原顺 ...

  6. 九宫格图案解锁、支付宝解锁、微信钱包解锁

    先来看看效果: 1.九宫格界面实现了密码的绘制,包括:绘制中.绘制不符合要求.绘制成功3个状态 2.绘制过程的监听:绘制错误.绘制成功,以及密码点所对应的密码 3.附上源码(编码:UTF-8,可导入到 ...

  7. android开发图案解锁,Android开发中图案解锁完整版

    学习目的 通过学习Android里面的onTouchEvent方法对上篇的图案解锁进行完善,调用touch方法实现触控功能和tag值得用法. 先关技术.及其使用 1.重写onTouchEvent方法 ...

  8. Android studio——图案解锁

    图案解锁 界面设计 实现控件点亮 点亮控件抬手后消失 完整代码 这篇写的是大致思路,如果想深入写一下的朋友可以看这个视频. 这次图案解锁我们用的是图片资源,不是绘制的,也就是说不能出现那种连线跟着手指 ...

  9. android开发图案解锁,Android_开发_Day23_图案解锁(下)

    Android_开发Day23图案解锁 目的: 综合运用Java以及C语言的思想来解决问题 技术: <1> onTouchEvent: onTouchEvent方法是当屏幕被触摸时系统调用 ...

最新文章

  1. 字符常量和仅包含一个字符的字符串之间的区别
  2. Kubernetes 1.14 版本发布:正式支持Windows 节点,持久化本地卷进入GA
  3. SQL Server(第二章) 字符串函数、日期时间函数、转换函数
  4. Corosync Pacemaker 高可用 Mariadb
  5. ML之UL:无监督学习Unsupervised Learning的概念、应用、经典案例之详细攻略
  6. 200721学习日报
  7. C++:05---class和struct
  8. python刷题+leetcode(第二部分)
  9. linux下pip换源——修改pip.conf文件
  10. 加快网站速度的最佳做法_(3)script脚本放在底部
  11. crossentropy java_示例CrossEntropyLoss用于pytorch中的3D语义分段
  12. 不支持给定路径的格式_【国考那些事】2021国/省考,申论答题格式,建议收藏!...
  13. AIX系统内存占用率的计算
  14. 动态规划之马拉车算法(Python解法)
  15. 云闪付华为P9指纹_华为云闪付app下载-华为云闪付 安卓版v9.0.11.301-PC6安卓网
  16. Unity开发 Photon Pun 多人游戏组件
  17. centos7 oracle11gR2安装
  18. 洛谷P2000 拯救世界(NTT+生成函数)
  19. 传统企业互联网转型升级
  20. 计算机辅助骨科手术的常用简称,大连理工大学创客:计算机辅助骨科手术提高接骨精准度...

热门文章

  1. stm32f103vet6利用fsmc控制LIL9341液晶屏
  2. java中ofd文件转pdf_ofd格式如何转换成word
  3. 【有限元分析】异型密封圈计算泄漏量与参数化优化过程(带分析源文件)
  4. 开源许可协议 Open Source License
  5. spring家族 img圖
  6. 金庸武功之““兰花拂穴手””--elk5.5安装
  7. 对手在开拓,苹果在“堕落”,创新路上,苹果还能走多远
  8. 跳舞吧机器人爷叶运鹏_【学海有舟,从“融”出发】我,一个残障学生,觉得自己来学校会拖累同学,咋办?...
  9. 虚拟服务器启动顺序,虚拟机开机启动项设置方法
  10. 计算机的启动及关闭方法,如何关闭开机启动项