专栏首页Android小菜鸡自定义View学习之路(三)————验证码的实现

自定义View学习之路(三)————验证码的实现

简介:

走往android的进阶之路,避不开自定义View的学习和绘制。这里以绘制一个可用的验证码为例。开始系统的学习View的绘制。 验证码需求:

  • 类似于TextView。可以自己调节控件大小,也可以通过warp-content自适应直接使用。
  • 可点击重新生成验证信息。信息为随机的四位数
  • 需要有噪点去模糊验证信息。
  • 对外提供接口获取随机生成的验证信息。

自定义控件的实现步骤:

  1. 自定义View的属性(参考自定义View学习之路一)
  2. 在View的构造方法中获得我们自定义的属性 (参考自定义View学习之路一)
  3. 重写onMesure (在View的绘制中并不是必须重写该方法。不过大部分还是需要重新定制的。例如在本例中如果设置成warp-content并能不像我们想的一样根据字的大小自适应,而是占满了屏幕。这时,我们需要重新定制View在warp-content的时候的宽高大小)
  4. 重写onDraw(最重要的一步。可以理解为一个画板,可以在上面绘制我们想要的一切。而画板的出现位置和大小就来源于onMesure的绘制)

定义参数:

mContent:验证信息的内容(可在xml中设置,默认值为“”) mContentColor:验证信息的字体颜色(可在xml中设置,默认值为黑色) mContentSize:验证信息的字体大小(可在xml中设置,默认值为10) mBackGround:验证码的背景颜色(可在xml中设置,默认值为绿色) mBound:声明Reac mBorderColor:边框颜色(默认值为黑色) mBorderSize:边框大小(默认值为1) mRandom:声明Random mInterfrenceCount:声明干扰项的个数(默认值为100) mPaint:声明Paint

构造函数:

1.重写一参、二参、三参构造函数,将一参、二参的构造函数都指向三参。

  1. 在三参构造函数中利用TypeArray获取View的属性(自定义的属性)
  2. 实例化Paint和Reac。
  3. 给一个默认的mContent
  4. 给View加入点击事件

内部私有函数:

  • drawBackground(Canvas canvas);绘制背景
  • drawBroder(Canvas canvas);绘制边框
  • drawContent(Canvas canvas);绘制验证信息
  • drawInterference(Canvas canvas);绘制干扰项
  • String createRandomNumber();随机生成一个四个数

对外提供接口:

  • String getContent();获取验证信息

onMeasure(int widthMeasureSpec, int heightMeasureSpec):

  在不重写的情况下,指定宽高以及match- parent是正常的,但是 warp-content也会铺满整个ViewGroup跟预期不符。所以需要针对 warp-content进行处理。   MeasureSpec的specMode,一共三种类型,当达到类似条件,specMode会等于此类型的值:

  • EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
  • AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
  • UNSPECIFIED:表示子布局想要多大就多大,很少使用

  因为我们在选择warp-content时我们的宽度是内容的宽度。所以我们需要重新去测量它。而内容的宽度来源于Rect。   最后别忘记setMeasuredDimension(width, height);将我们调试好的宽高度绘制上去。

onDraw(Canvas canvas):

  在onDraw中绘制我们的所有内容,调用编写好的所有绘制方法即可。而调用postInvalidate();会导致调用onDraw方法达到更新的作用。

困难与心得:

  • 在onMeasured测量宽高的时候。对warp-content测量时,仅仅让他适应字体宽高是不行的。难看不说,在后面会对宽高度进行随机取值,并且有范围判断。因为测量的宽高太小,导致冲突。所以,在测量时就在原有的基础上手动增加了一个字体宽高。并且因为字体大小等因素影响,在后面随机取值时我抛出了一个异常,提示使用者出问题的原因。
  • 在画Text的时候,确定了它的x、y轴后,它会在这个坐标点开始,往上绘制。给人的感觉就是它是以左下角为坐标点的。所以为了保证验证内容不超出View范围。在做x、y的随机点时需要做范围判断。

附件:

verificationCode下载地址 若附件无法下载,请复制打开连接,在浏览器重新执行即可!!

参考文章:

https://www.jianshu.com/p/84cee705b0d3 http://www.cnblogs.com/jiayongji/p/5560806.html https://blog.csdn.net/lmj623565791/article/details/24252901/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ADB命令

      adb命令位于Android SDK下的platform-tools自带。能够通过wifi远程下载APK,也能够答应日志信息。Android Studio的...

    饮水思源为名
  • Android自定义View--数字软键盘

    由于换工作换城市,很长时间没有更新了。来到新公司,接到一个需求,要求在PAD屏幕上显示一个数字键盘,作为密码录入。想着练练手,就用自定义View绘制了一个,分享...

    饮水思源为名
  • Android知识点基础篇(二)

    asset与res.png ** 注意: ** 1 assets目录下的资源文件不会在R.java自动生成ID,所以读取assets目录下的...

    饮水思源为名
  • 闪电网络实操,从最简单的比特币第二层闪电网络付款开始

    我们将会使用命令行工具,因为我发现这是使用网络的最可靠的方法,同时也可以让你对网络的运行方式有更加深入的了解。

    区块链大本营
  • 利用生成函数求斐波那契数列通项公式

    先吐槽一下,学习这玩意儿的时候真的是深深的明白了自己的弱小,人家的一个"解得"我居然解了两个小时。。qwq

    attack
  • leetcode第一题判断链表是否有环

    数据结构表征数据存储的格式及操作数据的方式,了解这些便于我们大数据开发人员设计更好的存储,读取,计算策略。所以在java基础,大数据基础,大数据框架源码等都有一...

    Spark学习技巧
  • 从头学一次J2EE笔记

    1、在Servlet3.5规范之前,Java Web 应用的绝大部分组件都通过web.xml 文件来配置管理, Servlet3.0 规范可通过Annotati...

    陈树义
  • 第二阶段-Java面向对象:【第二章 继承】

    其实在我们面向对象这一阶段的学习中,我们就是围绕Java的三大特性(封装、继承、多态)来讲解的,在上一掌内容中我们讲解了一部分封装的有关知识,今天我们来重点学习...

    BWH_Steven
  • R语言绘制大热图

    用户1359560
  • 李子骅II敏捷思想在产品周期的延伸

    今天我们会围绕两个关键的点来讨论:一个是关注非功能需求,另一个是DevOps相关的策略。

    Worktile

扫码关注云+社区

领取腾讯云代金券