f06164247ff418f8d88b0d6479ca9b831b209118.svn-base 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.hjq.dialog.widget;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Paint;
  5. import android.graphics.Path;
  6. import android.support.annotation.Nullable;
  7. import android.util.AttributeSet;
  8. import android.util.TypedValue;
  9. import android.view.View;
  10. /**
  11. * desc : 密码遮挡自定义控件
  12. */
  13. public final class PasswordView extends View {
  14. private Paint mPaint;
  15. private Path mPath;
  16. private Paint mPointPaint;
  17. // 单个密码框的宽度
  18. private int mItemWidth = 44;
  19. // 单个密码框的高度
  20. private int mItemHeight = 41;
  21. // 中心黑点的半径大小
  22. private static final int POINT_RADIUS = 15;
  23. // 中心黑点的颜色
  24. private static final int POINT_COLOR = 0xFF666666;
  25. // 密码框边界线的颜色值
  26. private static final int STROKE_COLOR = 0xFFECECEC;
  27. // 密码总个数
  28. public static final int PASSWORD_COUNT = 6;
  29. // 已经输入的密码个数,也就是需要显示的小黑点个数
  30. private int mCurrentIndex = 0;
  31. public PasswordView(Context context) {
  32. this(context, null);
  33. }
  34. public PasswordView(Context context, @Nullable AttributeSet attrs) {
  35. this(context, attrs, 0);
  36. }
  37. public PasswordView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  38. super(context, attrs, defStyleAttr);
  39. mItemWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mItemWidth, getResources().getDisplayMetrics());
  40. mItemHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mItemHeight, getResources().getDisplayMetrics());
  41. mPaint = new Paint();
  42. mPaint.setAntiAlias(true); //设置抗锯齿
  43. mPaint.setColor(STROKE_COLOR); //设置颜色
  44. mPaint.setStyle(Paint.Style.STROKE); //设置描边
  45. mPath = new Path();
  46. mPath.moveTo(0, 0);
  47. mPath.lineTo(mItemWidth * PASSWORD_COUNT, 0);
  48. mPath.lineTo(mItemWidth * PASSWORD_COUNT, mItemHeight);
  49. mPath.lineTo(0, mItemHeight);
  50. mPath.close();
  51. mPointPaint = new Paint();
  52. mPointPaint.setAntiAlias(true);
  53. mPointPaint.setStyle(Paint.Style.FILL);
  54. mPointPaint.setColor(POINT_COLOR);
  55. }
  56. @Override
  57. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  58. switch (MeasureSpec.getMode(widthMeasureSpec)) {
  59. case MeasureSpec.AT_MOST:
  60. case MeasureSpec.UNSPECIFIED:
  61. widthMeasureSpec = MeasureSpec.makeMeasureSpec(mItemWidth * PASSWORD_COUNT, MeasureSpec.EXACTLY);
  62. break;
  63. case MeasureSpec.EXACTLY:
  64. break;
  65. }
  66. switch (MeasureSpec.getMode(heightMeasureSpec)) {
  67. case MeasureSpec.AT_MOST:
  68. case MeasureSpec.UNSPECIFIED:
  69. heightMeasureSpec = MeasureSpec.makeMeasureSpec(mItemHeight, MeasureSpec.EXACTLY);
  70. break;
  71. case MeasureSpec.EXACTLY:
  72. break;
  73. }
  74. setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
  75. }
  76. @Override
  77. protected void onDraw(Canvas canvas) {
  78. mPaint.setStrokeWidth(5);
  79. canvas.drawPath(mPath, mPaint);
  80. // 画单个的分割线
  81. mPaint.setStrokeWidth(3);
  82. for (int index = 1; index < PASSWORD_COUNT; index++) {
  83. canvas.drawLine(mItemWidth * index, 0, mItemWidth * index, mItemHeight, mPaint);
  84. }
  85. // 绘制中间的小黑点
  86. if (mCurrentIndex == 0) {
  87. return;
  88. }
  89. for (int i = 1; i <= mCurrentIndex; i++) {
  90. canvas.drawCircle(i * mItemWidth - mItemWidth / 2, mItemHeight / 2, POINT_RADIUS, mPointPaint);
  91. }
  92. }
  93. /**
  94. * 改变密码提示小黑点的个数
  95. */
  96. public void setPassWordLength(int index) {
  97. mCurrentIndex = index;
  98. invalidate();
  99. }
  100. }