首先,我们来看看实现的是怎么样的效果:
如果我们拿到这样的UI,想到的布局应该是用4个EditText包在横向的LinearLayout里面,但今天要讲的View,所以我们决定用一个自定义的EditText 画出来。
学到什么?
基本理解画布概念
画布的状态、平移
布局测量
画图片
功能需求
高亮当前输入框
输入满4个数字自动调用方法
思路
完全重画一个EditText,就包含了测量布局和重新绘制这两个关键步骤。好了,到这里理一下整体的思路:
根据验证码个数以及边框大小来计算输入框显示的宽度
覆盖原来的EditText画布,重新绘制方框
根据输入的索引来确定高亮的方框
重写onTextChanged 但满足验证码个数的时候调用自动完成方法
开始动手
准备开始了,果断继承一个AppCompatEditText 来初始化基本参数先:
验证码个数
输入方框的大小
边框的大小及间距
/**
* 验证码输入框,重写EditText的绘制方法实现。
* @author RAE
*/
public class CodeEditText extends AppCompatEditText {
// 验证码文本颜色
private int mTextColor;
// 输入的最大长度
private int mMaxLength = 4;
// 边框宽度
private int mStrokeWidth;
// 边框高度
private int mStrokeHeight;
// 边框之间的距离
private int mStrokePadding = 20;
// 用矩形来保存方框的位置、大小信息
private final Rect mRect = new Rect();
// 方框的背景
private Drawable mStrokeDrawable;
/**
* 构造方法
*
*/
public CodeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CodeEditText);
int indexCount =