我们现在要实现一个自定义输入框,显示用户接受到的验证码,大概是长这样
思路分析
Q:需要有哪些功能?
A:框代表的是验证码长度,这个需要可配置;只接收数字并可以编辑删除;输入和未输入有状态区别
Q:可以怎么实现?
A:直觉上是直接继承EditView,重写onDraw方法
Q:为什么要继承EditView而不是TextView甚至是View?
A:如果继承View,那控件的逻辑能力也需要自己实现,比如输入法的弹出和隐藏,输入法内容的接收需要重写onCreateInputConnection等方法。EditView比TextView多的能力是设置Selection光标位置,文字默认可编辑可定义输入法类型。
综上:该自定义需求,系统控件的EditView功能上可以满足,只是需要自定义魔改下UI。
码上
1,新建一个自定义View继承于EditView,并复写onDraw和onMeasure
1 | class CustomInputView2 : EditText { |
2,仔细看一下onMeasure
1 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { |
3,把元素绘制上去,onDraw
画图三要素:画布(canvas),画笔(paint),画哪里(LRTB)。
1 | // 1,绘制框,调用canvas API drawRoundRect(rectF, itemRadius, itemRadius, paint) |
4,控件可以自定义字段
1 | <declare-styleable name="CustomInputView"> |
5,继承于EditView,需要初始化一些字段
1 | // 输入类型指定为数字键盘 |