关于九宫格密码的思考
网上有很多关于9宫格密码的资料,比如这篇博客,http://blog.csdn.net/abren32/article/details/48683625,还有视频学习资料,讲的都很好,但是对于我这种菜鸟来说,看起来还是有很多困难的,不知道是他们太牛了不用讲这些细节点还是我太笨了看不懂,我自己把这个代码写了一遍,发现很多小的知识点还是很重要的,对于初学者来说,搞清楚这些要比懂API的使用方法要重要的多。下面就做一个总结,防止自己忘记,也希望大神们拍砖。

  • 居中问题
    在自定义view中,居中问题一直是一个很重要的问题,这个问题也一直很困惑,比如在一个自定义圆中让字体居中,这个我就很懵懂,好像涉及到字体的baseline等乱七八糟的,很多大神在讲自定义view中也是对这方面一带而过,毕竟只是实现效果即可,并没有深入去研究。
    下面我们看一下效果图

    嗯,根据目测,挺居中的,设置一下padding和在上面写几个乱七八糟的布局试试。

    可以看出来,布局并没有因为其他布局问题变乱(其实这个问题在自定义view中很容易出现,设置一下margin啊padding啊等属性就会出现该问题)。
    接下来我们分析一下代码:
private void initPoint() {mPaintNormal = new Paint();mPaintNormal.setColor(Color.parseColor("#4EC864"));mPaintNormal.setFlags(Paint.ANTI_ALIAS_FLAG);//按下时候的画笔mPaintPressed = new Paint();mPaintPressed.setColor(Color.parseColor("#088E1F"));mPaintPressed.setFlags(Paint.ANTI_ALIAS_FLAG);//错误画笔mPaintError = new Paint();mPaintError.setColor(Color.RED);mPaintError.setFlags(Paint.ANTI_ALIAS_FLAG);//竖屏if (mWidth < mHeight) {mOffsetY = (mHeight - mWidth)/2;}//横屏else if (mWidth > mHeight) {mOffsetX = (mWidth - mHeight)/2 ;mWidth = mHeight;}mPoints[0][0] = new NinePoint(mOffsetX+mWidth/4,mOffsetY+mWidth/4,mRadius);mPoints[0][1] = new NinePoint(mOffsetX+mWidth/2,mOffsetY+mWidth/4,mRadius);mPoints[0][2] = new NinePoint(mOffsetX+mWidth*3/4,mOffsetY+mWidth/4,mRadius);mPoints[1][0] = new NinePoint(mOffsetX+mWidth/4,mOffsetY+mWidth/2,mRadius);mPoints[1][1] = new NinePoint(mOffsetX+mWidth/2,mOffsetY+mWidth/2,mRadius);mPoints[1][2] = new NinePoint(mOffsetX+mWidth*3/4,mOffsetY+mWidth/2,mRadius);mPoints[2][0] = new NinePoint(mOffsetX+mWidth/4,mOffsetY+mWidth-mWidth/4,mRadius);mPoints[2][1] = new NinePoint(mOffsetX+mWidth/2,mOffsetY+mWidth-mWidth/4,mRadius);mPoints[2][2] = new NinePoint(mOffsetX+mWidth*3/4,mOffsetY+mWidth-mWidth/4,mRadius);}

可以看到在初始化9个点的时候,我们分别加上了mWidth/4,mWidth/2等一些值,不过,这是什么鬼,我们为什么加上它,不加不行吗?假设我们把第一行代码改成这样:

 mPoints[0][0] = new NinePoint(mOffsetX+mWidth/4,mOffsetY,mRadius);
        mPoints[0][1] = new NinePoint(mOffsetX+mWidth/2,mOffsetY,mRadius);
        mPoints[0][2] = new NinePoint(mOffsetX+mWidth*3/4,mOffsetY,mRadius);        mPoints[1][0] = new NinePoint(mOffsetX+mWidth/4,mOffsetY+mWidth/4,mRadius);
        mPoints[1][1] = new NinePoint(mOffsetX+mWidth/2,mOffsetY+mWidth/4,mRadius);
        mPoints[1][2] = new NinePoint(mOffsetX+mWidth*3/4,mOffsetY+mWidth/4,mRadius);        mPoints[2][0] = new NinePoint(mOffsetX+mWidth/4,mOffsetY+mWidth/2,mRadius);
        mPoints[2][1] = new NinePoint(mOffsetX+mWidth/2,mOffsetY+mWidth/2,mRadius);
        mPoints[2][2] = new NinePoint(mOffsetX+mWidth*3/4,mOffsetY+mWidth/2,mRadius);

效果图就是这样了

可以看到,9宫格整体上移了,有人说了,这部废话吗,你少加了mWidth/4…巴拉巴拉。。。。。是的,但是我们重点来了,你发现没有,我们这个正方形并不是我们想像中的那样,在我的想象中,或者大家的想象中,我们计算完偏移量之后,直接默认的就是这个清形了,就是这张图:

貌似很多博客里讲述的时候也是这样子的,这个应该是错的吧?也许是我理解错了

其实这个理解应该不对吧?事实上真正的图是这样的:
两条横线我是根据偏移量来画的,所以,不要对它产生怀疑,代码如下:

canvas.drawLine(mOffsetX,mOffsetY,mWidth,mOffsetY,mPaintError);canvas.drawLine(mOffsetX,mOffsetY+mWidth,mWidth,mOffsetY+mWidth, mPaintError);

可以看到,实际上偏移量我们都理解错了,如果以画的圆为基准的话,偏移量是mOffsetsX+mWidth/4,而不是简单的mOffsets,很多人(也许只有我。。。)会对这几段代码产生很大的疑问。图和代码写的不一致,明明画的只有偏移量,你丫的为什么还要在后面加上mWidth/4,这是搞什么鬼,这里借用一下这个哥们画的图
根据它的图来看,要想让圆居中,只需要这样就行了(请具体参照开头博客)

mPoints[0][0] = new Point(offSetX + pointItemWidth, offSetY);

而源代码是这样的

mPoints[0][0] = new Point(offSetX + pointItemWidth, offSetY + pointItemWidth);

加了一个pointItemWidht 也就是1/4的布局宽度(以布局宽度为最小边情况下),我擦,你这我没法理解了,画的是居中的,你加这个值我怎么理解,这里贴一下那个哥们的源代码

// 当前视图的大小int width = getWidth();int height = getHeight();// 九宫格点的偏移量int offSet = Math.abs(width - height) / 2;// x、y轴上的偏移量int offSetX = 0, offSetY = 0;int pointItemWidth = 0; // 每个点所占用方格的宽度if (width > height){ // 横屏的时候offSetX = offSet;offSetY = 0;pointItemWidth = height / 4;}if (width < height){ // 竖屏的时候offSetX = 0;offSetY = offSet;pointItemWidth = width / 4;}

该段代码中有一句话:

** //九宫格点的偏移量int offSet = Math.abs(width - height) / 2;**

这个应该是外面正方形的偏移量,而真正的圆点偏移量应该是

offSetX + pointItemWidth, offSetY + pointItemWidth

巴拉巴拉、、、、、、
说了这么多,我其实也不知道自己说的对不对,也许从一开始就理解错了,但是理解一下也蛮好的,希望走过路过,不要忘记拍砖,下面用一幅图来理解本篇博客:

关于九宫格密码的思考相关推荐

  1. android九宫格忘了,九宫格密码忘了怎么办?九宫格锁屏忘记密码解决方法

    有时我们会遇到开机九宫格密码丢失无法进入系统,下面本文就告诉大家九宫格锁屏忘记密码解决方法: 以下操作会有较大的数据风险,可能会导致手机上的个人资料.通讯录.应用丢失,请提前做好数据风险提醒和备份工作 ...

  2. Android自定义九宫格密码解锁

    最终效果 相关代码 布局文件 <?xml version="1.0" encoding="utf-8"?> <androidx.constra ...

  3. 7-1 九宫格密码 (100 分)

    随着智能手机的普及,各种应用也层出不穷,安卓的九宫格密码就是其中之一.安卓的九宫格密码可以看做是3×3点阵中的一条路径,只要你在画的时候,不经过重复的点,同时不跳过途中必须要经过的点,那么这条路径几乎 ...

  4. Html5实现手机九宫格密码解锁功能

    HTML5真的是很强大,前端时间看到一个canvas实现九宫格的密码解锁.今天抽出时间模仿了一个,特定分享一下! 效果截图如下: 效果看起来还不错吧! 源码如下: <!DOCTYPE html& ...

  5. html5手机密码修改,js+html5实现手机九宫格密码解锁功能

    HTML5真的是很强大,前端时间看到一个canvas实现九宫格的密码解锁.今天抽出时间模仿了一个,特定分享一下! 效果截图如下: 效果看起来还不错吧! 源码如下: html5实现网页解锁功能 html ...

  6. 网易笔试题-九宫格密码

    转自: www.cnblogs.com/shoker/p/3998270.html 一 问题描述: 九宫格,就是手机手势密码.有三问,一问是如果只设置2位密码,有多少种满足的密码,密码不能穿越,比如1 ...

  7. android九宫格密码源码,Android九宫格解锁的实现

    主要代码如下 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_par ...

  8. 安全篇之手机数字密码九宫格究竟哪个更安全?

    手机解锁经过多年发展已经是五花八门,密码解锁.图案解锁.指纹解锁各种各样的解锁方式.在功能机时代很多手机默认设置PIN码,每次开机都要输入PIN码才能进入手机界面,这是最早形式的手机解锁方式. 但在触 ...

  9. android 九宫格轨迹密码

    最近因为项目需要用到九宫格密码(也叫手势轨迹密码),特地去学习了一下九宫格密码的实现原来.可能有人认为九宫格密码事例网上到处都有,很多甚至直接拷贝过来就可以运行为什么还要学习呢.还特地写到网上有必要吗 ...

最新文章

  1. [NHibernate] Guid 作主键速度超慢的背后
  2. 01-Java基础语法
  3. 力扣: 88. 合并两个有序数组
  4. VTK:可视化之MultipleRenderWindows
  5. 创建一个存储函数,返回指定员工的姓名,薪水和年收入
  6. SAP Spartacus localStorage 里存储的 auth Token 过期时间
  7. 03-postgresql报错ERROR: operator does not exist: numeric = character varyin
  8. 【专栏精选】实战:使用LeanCloud实现玩家注册
  9. c语言编译如何去掉warning,16种C语言编译警告(Warning)类型的解决方法
  10. SpringCloud工作笔记066---断路器(Curcuit Breaker)模式
  11. linux文件及文件夹权限
  12. 多线程中的互斥控制程序代码_互斥锁解决 Python 中多线程共享全局变量的问题...
  13. Python中logging日志使用
  14. BZOJ4072[Wf2014] baggage
  15. java获取当前上一周、上一月、上一年的时间dxl
  16. 三级联动下拉框(省市县)存储数据库,包含信息回填
  17. 全智通A+常见问题汇总解答—A+配件仓库—维修领料—编辑领料单:最后一个仓库无法显示
  18. 华为 日志服务器 配置文件,华为设置日志服务器配置
  19. 将linux内核烧进arm板,ARM开发板上uClinux内核移植
  20. 概述 | 全景图像拼接技术全解析

热门文章

  1. “罪犯”取代蒸汽机CP上位英镑新钞,图灵何以与女王比肩?
  2. Program-Adaptive Mutational Fuzzing 翻译
  3. Python MTCNN(人脸检测)项目附代码讲解(1)-原理与论文介绍
  4. 刘强东@马云:你要搞垄断,我就拉上唯品会跟腾讯在一起
  5. 在华清远见的学习感悟
  6. 7.HBuilderX使用
  7. Python第二章课后总结
  8. “摸鱼”的打工人,“累死”了同事
  9. 全自动智能指纹锁方案
  10. python用matplotlib 用matshow()绘制矩阵,绘制矩阵图