Android 重写EditText自定义密码输入框

首先看看效果

如上图的密码输入框,没有密码时,有几个密码就有几条下划线,输入密码后显示的内容为“*”,并且底部就没有下划线了,同样有很多方式实现,这里就偷懒改改EditText来实现,所以需要做的就是画线、画“*”,代码很简单,偷懒也没有写attr,属性直接初始化写死了。这个思路同样适用于那些内容区域是方框的密码输入,就是画线和画矩形的区别。

1public class PasswordUnderLineEditText extends EditText { 2 3 public interface TextIndexChangeListener { 4 void onTextIndexChange(CharSequence text, int index); 5 } 6 7 private TextIndexChangeListener mTextIndexChangeListener; 8 9 @ColorInt 10 private int lineColor; 11 private int lineCount; 12 private int lineMargin; 13 private int lineHeight; 14 private int linePaddingBottom; 15 16 private String changedText; 17 private int changedTextSize; 18 private int changedTextColor; 19 private int textLength; 20 private boolean isHideLineOnChanged; 21 22 private Paint mLinePaint; 23 private TextPaint mChangedTextPaint; 24 25 26 public PasswordUnderLineEditText(Context context) { 27 this(context, null); 28 } 29 30 public PasswordUnderLineEditText(Context context, AttributeSet attrs) { 31 super(context, attrs); 32 lineColor = getResources().getColor(R.color.gray); 33 changedTextColor = getResources().getColor(R.color.black); 34 lineCount = 6; 35 changedTextSize = DensityUtil.sp2px(context, 20); 36 lineMargin = DensityUtil.dp2px(context, 12); 37 linePaddingBottom = DensityUtil.dp2px(context, 10); 38 lineHeight = DensityUtil.dp2px(context, 1); 39 40 changedText = "*"; 41 isHideLineOnChanged = true; 42 setGravity(Gravity.CENTER_VERTICAL); 43 setTextColor(getResources().getColor(android.R.color.transparent)); 44 setBackgroundColor(Color.WHITE); 45 setCursorVisible(false); 46 setInputType(InputType.TYPE_CLASS_NUMBER); 47 setFilters(new InputFilter[]{new InputFilter.LengthFilter(lineCount)}); 48 49 mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 50 mLinePaint.setColor(lineColor); 51 mLinePaint.setStyle(Paint.Style.FILL); 52 mLinePaint.setStrokeWidth(lineHeight); 53 mChangedTextPaint = new TextPaint(); 54 mChangedTextPaint.setColor(changedTextColor); 55 mChangedTextPaint.setTextSize(changedTextSize); 56 mChangedTextPaint.setStyle(Paint.Style.FILL); 57 } 58 59 @Override 60 protected void onDraw(Canvas canvas) { 61 super.onDraw(canvas); 62 int height = getHeight(); 63 int width = getWidth(); 64 canvas.save(); 65 66 int singleLineWidth = width / lineCount; 67 int startX = 0; 68 int stopX = 0; 69 int startY = height - linePaddingBottom; 70 for (int i = 0; i < lineCount; i++) { 71 if (textLength == 0) { 72 startX = i * singleLineWidth + lineMargin; 73 stopX = (i + 1) * singleLineWidth - lineMargin; 74 canvas.drawLine(startX, startY, stopX, startY, mLinePaint); 75 } else if (textLength > 0) { 76 int changeIndex; 77 if (isHideLineOnChanged) { 78 changeIndex = textLength; 79 } else { 80 changeIndex = 0; 81 } 82 startX = (i + changeIndex) * singleLineWidth + lineMargin; 83 stopX = (i + changeIndex + 1) * singleLineWidth - lineMargin; 84 canvas.drawLine(startX, startY, stopX, startY, mLinePaint); 85 } 86 } 87 for (int i = 0; i < textLength; i++) { 88 startX = i * singleLineWidth + lineMargin; 89 stopX = (i + 1) * singleLineWidth - lineMargin; 90 canvas.drawText(changedText, (startX + stopX) / 2 - changedTextSize / 4, (height + changedTextSize) / 2, mChangedTextPaint); 91 } 92 93 canvas.restore(); 94 } 95 96 97 @Override 98 protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { 99 this.textLength = text.length(); 100 invalidate(); 101 if(mTextIndexChangeListener!=null){ 102 mTextIndexChangeListener.onTextIndexChange(text,textLength); 103 } 104 }
点赞
收藏

评论区

加载中...

相关推荐

vue 支付密码组件

vue支付密码组件我们要做一个类似京东、支付宝支付时的6位密码组件,效果如下。!(https://oscimg.oschina.net/oscnet/up2a8038f271d1d5b909b0e3ce0c1d6fb4c8a.png)专门为PC端写的。移动端的很多框架基本都已经有了,而且实现逻辑会比pc简单,

ssh连接服务器

1.概述ssh是一种网络通信协议,用于计算机之间的加密登录.一般用ssh连接服务器有两种方式:密码认证与密钥认证.密码认证就是通过传统的输入密码的方式登录,密钥认证就是把产生的公钥注册到服务器后,用私钥登录,这样就可以不用每次登录输入密码.特别适合作者这种脑残记不住密码的懒人.2.密码认证密码认证登录直接在终端使用ssh

手把手教你用Python破解加密 zip 文件的密码

摄影:产品经理海鲜咖喱泡饭之前在家里的老电脑中,发现一个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,网上下载了很多破解密码的软件都没有效果,于是想到自己用Python写一个暴力破解密码的脚本。Python有一个内置模块zipfile可以干这个事情,测试一波,一个测试文件,设置解压密码为123。import zipfile

MySQL远端连接设置

下面是步骤:0、新安装完后是没有密码的,为root添加密码:mysqladminurootpasswordroot'spassword1、登陆本地的mysqlServer:mysql uroot p输入密码后进入mysql。参数u是输入用户名,这里是用root登陆,p是要输入密码。2、使用并查看mysql

ubuntu 16.04 tty登录显示 login incorrect,输入用户名后无法输入密码

按Ctrl Alt F3进入命令行终端。当输入用户名并按下时Enter后,它不会等待输入密码(就像Enter没有输入任何东西一样按下它)。即使我迅速输入密码,文本以明文显示,然后它继续说密码是错误的。然后循环提示 loginincorrect

Iterm2 记住ssh密码

\TOC\Iterm2记住ssh密码有了这玩意,今后就完全不在使用其他的ssh工具了之前都使用sshpass来做,但是sshpass会把密码直接暴露在屏幕上,所以后面就用了expect脚本的方式.一.准备配置文件添加配置文件文件路径自定!/usr/