| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- package com.hjq.dialog.widget;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Paint;
- import android.graphics.Path;
- import android.support.annotation.Nullable;
- import android.util.AttributeSet;
- import android.util.TypedValue;
- import android.view.View;
- /**
- * desc : 密码遮挡自定义控件
- */
- public final class PasswordView extends View {
- private Paint mPaint;
- private Path mPath;
- private Paint mPointPaint;
- // 单个密码框的宽度
- private int mItemWidth = 44;
- // 单个密码框的高度
- private int mItemHeight = 41;
- // 中心黑点的半径大小
- private static final int POINT_RADIUS = 15;
- // 中心黑点的颜色
- private static final int POINT_COLOR = 0xFF666666;
- // 密码框边界线的颜色值
- private static final int STROKE_COLOR = 0xFFECECEC;
- // 密码总个数
- public static final int PASSWORD_COUNT = 6;
- // 已经输入的密码个数,也就是需要显示的小黑点个数
- private int mCurrentIndex = 0;
- public PasswordView(Context context) {
- this(context, null);
- }
- public PasswordView(Context context, @Nullable AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public PasswordView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mItemWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mItemWidth, getResources().getDisplayMetrics());
- mItemHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mItemHeight, getResources().getDisplayMetrics());
- mPaint = new Paint();
- mPaint.setAntiAlias(true); //设置抗锯齿
- mPaint.setColor(STROKE_COLOR); //设置颜色
- mPaint.setStyle(Paint.Style.STROKE); //设置描边
- mPath = new Path();
- mPath.moveTo(0, 0);
- mPath.lineTo(mItemWidth * PASSWORD_COUNT, 0);
- mPath.lineTo(mItemWidth * PASSWORD_COUNT, mItemHeight);
- mPath.lineTo(0, mItemHeight);
- mPath.close();
- mPointPaint = new Paint();
- mPointPaint.setAntiAlias(true);
- mPointPaint.setStyle(Paint.Style.FILL);
- mPointPaint.setColor(POINT_COLOR);
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- switch (MeasureSpec.getMode(widthMeasureSpec)) {
- case MeasureSpec.AT_MOST:
- case MeasureSpec.UNSPECIFIED:
- widthMeasureSpec = MeasureSpec.makeMeasureSpec(mItemWidth * PASSWORD_COUNT, MeasureSpec.EXACTLY);
- break;
- case MeasureSpec.EXACTLY:
- break;
- }
- switch (MeasureSpec.getMode(heightMeasureSpec)) {
- case MeasureSpec.AT_MOST:
- case MeasureSpec.UNSPECIFIED:
- heightMeasureSpec = MeasureSpec.makeMeasureSpec(mItemHeight, MeasureSpec.EXACTLY);
- break;
- case MeasureSpec.EXACTLY:
- break;
- }
- setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- mPaint.setStrokeWidth(5);
- canvas.drawPath(mPath, mPaint);
- // 画单个的分割线
- mPaint.setStrokeWidth(3);
- for (int index = 1; index < PASSWORD_COUNT; index++) {
- canvas.drawLine(mItemWidth * index, 0, mItemWidth * index, mItemHeight, mPaint);
- }
- // 绘制中间的小黑点
- if (mCurrentIndex == 0) {
- return;
- }
- for (int i = 1; i <= mCurrentIndex; i++) {
- canvas.drawCircle(i * mItemWidth - mItemWidth / 2, mItemHeight / 2, POINT_RADIUS, mPointPaint);
- }
- }
- /**
- * 改变密码提示小黑点的个数
- */
- public void setPassWordLength(int index) {
- mCurrentIndex = index;
- invalidate();
- }
- }
|