最近项目要做一个支付密码 之前我已经有个支付密码输入框 但是只能点击第一个才能输入 并且删除的时候还出现了问题 索性直接抛弃之前的那个密码输入框 使用下面这个 一个简单的自定义View 可以设置边框颜色 密码颜色 边框圆角半径等 先给一张效果图
下面贴上代码
package com.yxt.kake.views.widgets;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.widget.EditText;
import com.yxt.kake.R;
import static android.graphics.Paint.ANTI_ALIAS_FLAG;
/**
* Desc:
* User: tiansj
*/
public class PasswordInputView extends EditText {
private static final int defaultContMargin = 5;
private static final int defaultSplitLineWidth = 3;
private int borderColor = 0xFFCCCCCC;
private float borderWidth = 5;
private float borderRadius = 3;
private int passwordLength = 6;
private int passwordColor = 0xFFCCCCCC;
private float passwordWidth = 8;
private float passwordRadius = 3;
private Paint passwordPaint = new Paint(ANTI_ALIAS_FLAG);
private Paint borderPaint = new Paint(ANTI_ALIAS_FLAG);
private int textLength;
public PasswordInputView(Context context, AttributeSet attrs) {
super(context, attrs);
DisplayMetrics dm = getResources().getDisplayMetrics();
borderWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, borderWidth, dm);
borderRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, borderRadius, dm);
passwordLength = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, passwordLength, dm);
passwordWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, passwordWidth, dm);
passwordRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, passwordRadius, dm);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PasswordInputView, 0, 0);
borderColor = a.getColor(R.styleable.PasswordInputView_pivBorderColor, borderColor);
borderWidth = a.getDimension(R.styleable.PasswordInputView_pivBorderWidth, borderWidth);
borderRadius = a.getDimension(R.styleable.PasswordInputView_pivBorderRadius, borderRadius);
passwordLength = a.getInt(R.styleable.PasswordInputView_pivPasswordLength, passwordLength);
passwordColor = a.getColor(R.styleable.PasswordInputView_pivPasswordColor, passwordColor);
passwordWidth = a.getDimension(R.styleable.PasswordInputView_pivPasswordWidth, passwordWidth);
passwordRadius = a.getDimension(R.styleable.PasswordInputView_pivPasswordRadius, passwordRadius);
a.recycle();
borderPaint.setStrokeWidth(borderWidth);
borderPaint.setColor(borderColor);
passwordPaint.setStrokeWidth(passwordWidth);
passwordPaint.setStyle(Paint.Style.FILL);
passwordPaint.setColor(passwordColor);
}
@Override
protected void onDraw(Canvas canvas) {
int width = getWidth();
int height = getHeight();
// 外边框
RectF rect = new RectF(0, 0, width, height);
borderPaint.setColor(borderColor);
canvas.drawRoundRect(rect, borderRadius, borderRadius, borderPaint);
// 内容区
RectF rectIn = new RectF(rect.left + defaultContMargin, rect.top + defaultContMargin,
rect.right - defaultContMargin, rect.bottom - defaultContMargin);
borderPaint.setColor(Color.WHITE);
canvas.drawRoundRect(rectIn, borderRadius, borderRadius, borderPaint);
// 分割线
borderPaint.setColor(borderColor);
borderPaint.setStrokeWidth(defaultSplitLineWidth);
for (int i = 1; i < passwordLength; i++) {
float x = width * i / passwordLength;
canvas.drawLine(x, 0, x, height, borderPaint);
}
// 密码
float cx, cy = height/ 2;
float half = width / passwordLength / 2;
for(int i = 0; i < textLength; i++) {
cx = width * i / passwordLength + half;
canvas.drawCircle(cx, cy, passwordWidth, passwordPaint);
}
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
this.textLength = text.toString().length();
invalidate();
}
public int getBorderColor() {
return borderColor;
}
public void setBorderColor(int borderColor) {
this.borderColor = borderColor;
borderPaint.setColor(borderColor);
invalidate();
}
public float getBorderWidth() {
return borderWidth;
}
public void setBorderWidth(float borderWidth) {
this.borderWidth = borderWidth;
borderPaint.setStrokeWidth(borderWidth);
invalidate();
}
public float getBorderRadius() {
return borderRadius;
}
public void setBorderRadius(float borderRadius) {
this.borderRadius = borderRadius;
invalidate();
}
public int getPasswordLength() {
return passwordLength;
}
public void setPasswordLength(int passwordLength) {
this.passwordLength = passwordLength;
invalidate();
}
public int getPasswordColor() {
return passwordColor;
}
public void setPasswordColor(int passwordColor) {
this.passwordColor = passwordColor;
passwordPaint.setColor(passwordColor);
invalidate();
}
public float getPasswordWidth() {
return passwordWidth;
}
public void setPasswordWidth(float passwordWidth) {
this.passwordWidth = passwordWidth;
passwordPaint.setStrokeWidth(passwordWidth);
invalidate();
}
public float getPasswordRadius() {
return passwordRadius;
}
public void setPasswordRadius(float passwordRadius) {
this.passwordRadius = passwordRadius;
invalidate();
}
}
另外 在res/values/attrs.xml加上下面属性
<declare-styleable name="PasswordInputView">
<attr name="pivBorderColor" format="color"/>
<attr name="pivBorderWidth" format="dimension"/>
<attr name="pivBorderRadius" format="dimension"/>
<attr name="pivPasswordColor" format="color"/>
<attr name="pivPasswordWidth" format="dimension"/>
<attr name="pivPasswordRadius" format="dimension"/>
<attr name="pivPasswordLength" format="integer"/>
</declare-styleable>
布局文件
<com.yxt.kake.views.widgets.PasswordInputView
android:id="@+id/again_paypswd_pet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cursorVisible="false"
android:background="@color/transparent"
android:inputType="number"
android:maxLength="6"
app:pivBorderColor="@color/divide_line_color"
app:pivBorderRadius="2dp"
app:pivBorderWidth="1px"
app:pivPasswordColor="@color/black"
app:pivPasswordLength="6"
app:pivPasswordWidth="2dp" />
然后在activity中找到这个控件,用
again_paypswd_pet.getText()
来获取密码
到此,一个能实现自己想要功能的支付密码输入框就此完成