您的位置:首页 > 其它

自定义数字密码EditText输入框

2016-08-10 15:25 666 查看
public class DigitPasswordView extends EditText {
private static final String TAG = DigitPasswordView.class.getName();
private static float DEFAULT_LINE_WIDTH = 3;//默认线框宽度
private static final int DEFAULT_LINE_COLOR = Color.BLACK;//默认线框颜色
private static final float DEFAULT_TEXT_SIZE = 15;
private static final String DEFAULT_PASS_SHOW = "*";

private float lineWidth = DEFAULT_LINE_WIDTH;
private int lineColor = DEFAULT_LINE_COLOR;
private int textColor = DEFAULT_LINE_COLOR;
private float textSize = DEFAULT_TEXT_SIZE;
private final String pass = DEFAULT_PASS_SHOW;
private int mCount = 6;
private Paint mPaint;

public DigitPasswordView(Context context) {
super(context);
}

public DigitPasswordView(Context context, AttributeSet attrs) {
super(context, attrs);
//初始化
this.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
this.setBackgroundColor(Color.TRANSPARENT);
this.setCursorVisible(false);
this.setPadding(0, 0, 0, 0);

mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
final TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DigitPasswordView);
lineWidth = typedArray.getDimension(R.styleable.DigitPasswordView_lineWidth, DEFAULT_LINE_WIDTH);
lineColor = typedArray.getColor(R.styleable.DigitPasswordView_lineColor, DEFAULT_LINE_COLOR);
textColor = typedArray.getColor(R.styleable.DigitPasswordView_textColor, DEFAULT_LINE_COLOR);
textSize = typedArray.getDimension(R.styleable.DigitPasswordView_textSize, DEFAULT_TEXT_SIZE);
typedArray.recycle();

mPaint.setStrokeWidth(lineWidth);
mPaint.setTextSize(textSize);

}

public DigitPasswordView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
protected void onDraw(Canvas canvas) {
//        super.onDraw(canvas);

int w = getMeasuredWidth();
int h = getMeasuredHeight();

int cellW = w / mCount;

//绘制背景线框
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(lineColor);

float dx = lineWidth / 2;
canvas.drawRect(dx, dx, w - dx, h - dx, mPaint);
canvas.save();
for (int i = 0; i < mCount - 1; i++) {
canvas.translate(cellW, 0);
canvas.drawLine(0, 0, 0, h, mPaint);
}
canvas.restore();

//绘制内容
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(textColor);
canvas.save();
canvas.translate((cellW - mPaint.measureText(pass)) / 2, 0);
Paint.FontMetrics metrics = mPaint.getFontMetrics();
float y = (int) (h / 2 + Math.abs((metrics.ascent + metrics.descent) / 2));
for (int i = 0; i < getText().length(); i++) {
canvas.drawText(pass, 0, y, mPaint);
canvas.translate(cellW, 0);
}
canvas.restore();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int width = measureWidth(widthMeasureSpec);
int height = measureHeight(heightMeasureSpec);
setMeasuredDimension(width, height);
}

private int measureWidth(int widthMeasureSpec) {
int mode = MeasureSpec.getMode(widthMeasureSpec);
int size = 0;
switch (mode) {
case MeasureSpec.EXACTLY:
size = MeasureSpec.getSize(widthMeasureSpec);
break;
case MeasureSpec.AT_MOST:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mCount; i++) {
sb.append(" " + pass + " ");
}
size = (int) mPaint.measureText(sb.toString());
size += (mCount + 1) * lineWidth;
break;
}
return size;
}

private int measureHeight(int heightMeasureSpec) {
int mode = MeasureSpec.getMode(heightMeasureSpec);
int size = 0;
switch (mode) {
case MeasureSpec.EXACTLY:
size = MeasureSpec.getSize(heightMeasureSpec);
break;
case MeasureSpec.AT_MOST:
Paint.FontMetrics metrics = mPaint.getFontMetrics();
size = (int) (metrics.bottom - metrics.top + 2 * lineWidth) + 1;
break;
}
return size;
}

}


<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="DigitPasswordView">
<attr name="lineColor" format="color|reference"/>
<attr name="lineWidth" format="dimension|reference"/>
<attr name="textColor" format="color|reference"/>
<attr name="textSize" format="dimension|reference"/>
</declare-styleable>
</resources>


“`


“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  自定义 密码框 控件
相关文章推荐