仿支付宝密码控件

项目中正好要用到这个功能。

  • 先看效果
方形格子密码输入

说一下,6个格子这个有2种画法,一种就是直接画6个小格子,第二种就是先画外面的大矩形,里面在画5条竖线。我采取后者。一定要在xml设置 android:maxLength属性

/**
 * 方格子密码控件
 * Created by Admin on 2016/6/3.
 */
public class SquarePasswordView extends EditText {
    /**
     * 密码长度。通过在xml中的 android:maxLength 设置
     */
    private int max;
    private final Paint paint;
    private int borderColor = Color.LTGRAY;

    public SquarePasswordView(Context context, AttributeSet attrs) {
        super(context, attrs);

        paint = new Paint();
        //获得android:maxLength设置的值
        max = UIUtils.getMaxLen(this);
        if (max <1){
            throw  new IllegalArgumentException("android:maxLength < 1");
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        if (MeasureSpec.AT_MOST == widthMode) {
            widthMeasureSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY);
        }


        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    //屏蔽长按时出现那个粘贴功能
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return false;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //单个密码格子的宽度
        int itemW = getMeasuredWidth() / max;
        int itemH = getMeasuredHeight() / 2;
        paint.setColor(borderColor);
        paint.setStyle(Paint.Style.STROKE);
        //先画外面的大矩形
        canvas.drawRect(0, 0, getMeasuredWidth() - 1, getMeasuredHeight() - 1, paint);
        //在画内部的几条竖线。
        for (int i = 0; i < max - 1; i++) {
            int x = itemW * (i + 1);
            canvas.drawLine(x, 0, x, getMeasuredHeight()-1, paint);
        }
    
      //下面画圆形密码。每输入一个就画一个
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.FILL);
        int y = itemH;
        int x = 0;
        int radius = itemW / 6;
        //根据输入的文本长度来画圆
        for (int i = 0; i < getText().length(); i++) {
            x = (itemW / 2) + i * itemW;
            canvas.drawCircle(x, y, radius, paint);
        }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,892评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,851评论 0 17
  • 照片,是一个不常联系的朋友在微信上刚发的,连同五个字一一黑暗里绚烂。和他也没多大交情,只是在朋友聚会后的雨夜,他开...
    红满江阅读 916评论 0 0
  • 他很健忘经常会忘记她的生日包括自己的生日忘记结婚纪念日甚至忘记小孩究竟上到了几年级然而他不会忘记每天回家的日子每个...
    候鸟飞呀阅读 3,671评论 3 2