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

先上效果图

                   

关于项目的分析,见下图

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. veeam.Backup.and.Replication 6 测试之二--backup和replication功能
  2. python用中文怎么说-震惊!!!python可以用中文写代码
  3. android 之json对象解析并展示(含json解析源码)
  4. [react-native]-ReactNative为iOS打包ipa文件
  5. iis 改了php ini不生效,Windows IIS 集成PHP时修改PHP.ini 配置后不生效问题
  6. 解锁redis锁的正确姿势
  7. 炸裂!谷歌这波操作,预警了什么?
  8. mysql 重启_windows下重启mysql的方法
  9. Java的finally理解
  10. mirror - 映射在远端节点上的档案
  11. Summernote个性化定制使用帮助(二)
  12. cf. Is your horseshoe on the other hoof?
  13. Web APIs --JavaScript学习笔记(总)(包括DOM、BOM)
  14. 盗版服务器系统防范勒索病毒,服务器防止勒索病毒
  15. SpringBoot开源项目案例
  16. 服务器系统xb21cn,Office2010/2016精简三合一版(xb21cn-0901版)
  17. 异步FIFO基本原理(基于Verilog的简单实现)
  18. ipad4使用教程 ipad mini使用技巧
  19. 搜索词纠错、相关搜索的原理与实现
  20. 《哲学家们都干了些什么》读后感

热门文章

  1. 品牌管理中使用FastDFS
  2. (WPF)连锁超市收银系统总结
  3. eclipse java混淆打包,Android Studio和eclipse混淆打包总结
  4. ASP.NET MVC 音乐商店 - 2.控制器
  5. Centos7下安装yum install net-tools一些常见问题
  6. 因为意外的遇到文件尾,PS无法打开怎么办?
  7. Linux 10GE端口,ES5D001VST00 2端口 万兆10GE SFP 华为 S5700交换机 光接口板
  8. xsl特殊符号输出总结
  9. 全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么
  10. bzoj 3620: 似乎在梦中见过的样子 kmp算法+暴力