Android四方形输入框、密码框
16lz
2021-01-24
Android四方形输入框、密码框
一、自定义view继承EditText,代码中控制输入框的个数和是否为可见密码格式
package com.example.testcostumview.inputbox;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.support.v7.widget.AppCompatEditText;import android.util.AttributeSet;import android.widget.EditText;public class PwdEditText extends AppCompatEditText { /** * 间隔 */ private final int PWD_SPACING = 5; /** * 密码大小 */ private final int PWD_SIZE =10; /** * 密码长度 */ private final int PWD_LENGTH = 4; /** * 上下文 */ private Context mContext; /** * 宽度 */ private int mWidth; /** * 高度 */ private int mHeight; /** * 密码框 */ private Rect mRect; /** * 密码画笔 */ private Paint mPwdPaint; private Paint mPwdPaintText; /** * 密码框画笔 */ private Paint mRectPaint; /** * 输入的密码长度 */ private int mInputLength; /** * 输入结束监听 */ private OnInputFinishListener mOnInputFinishListener; private String text; private boolean isPassword=false; /** * 构造方法 * * @param context * @param attrs */ public PwdEditText(Context context, AttributeSet attrs) { super(context, attrs); TypedArray array =context.obtainStyledAttributes(attrs , R.styleable.PwdEditText); isPassword=array.getBoolean(R.styleable.PwdEditText_password,false); pwdLegth=array.getInteger(R.styleable.PwdEditText_length,0); // 初始化密码画笔 mPwdPaint = new Paint(); mPwdPaint.setColor(Color.parseColor("#cc0099")); mPwdPaint.setStyle(Paint.Style.FILL); mPwdPaint.setAntiAlias(true); // 初始化文字画笔 mPwdPaintText = new Paint(Paint.ANTI_ALIAS_FLAG); mPwdPaintText.setColor(Color.parseColor("#cc0099")); mPwdPaintText.setTextSize(60f); // 初始化密码框 mRectPaint = new Paint(); mRectPaint.setStyle(Paint.Style.STROKE); mRectPaint.setColor(Color.parseColor("#cc0099")); mRectPaint.setAntiAlias(true); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mWidth = getWidth(); mHeight = getHeight(); // 这三行代码非常关键,大家可以注释点在看看效果 Paint paint = new Paint(); paint.setColor(Color.WHITE); canvas.drawRect(0, 0, mWidth, mHeight, paint); // 计算每个密码框宽度 int rectWidth = (mWidth - PWD_SPACING * (PWD_LENGTH - 1)) / PWD_LENGTH; // 绘制密码框 for (int i = 0; i < PWD_LENGTH; i++) { int left = (rectWidth + PWD_SPACING) * i; int top = 2; int right = left + rectWidth; int bottom = mHeight - top; mRect = new Rect(left, top, right, bottom); canvas.drawRect(mRect, mRectPaint); } // 绘制密码 for (int i = 0; i < mInputLength; i++) { int cx = rectWidth / 2 + (rectWidth + PWD_SPACING) * i-15; int cy = mHeight / 2+15; if (!isPassword){ String[] c=text.split(""); canvas.drawText(c[i+1],cx, cy, mPwdPaintText); }else { canvas.drawCircle(cx, cy, PWD_SIZE, mPwdPaint); } } } @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { super.onTextChanged(text, start, lengthBefore, lengthAfter); this.mInputLength = text.toString().length(); this.text=text.toString(); invalidate(); if (mInputLength == PWD_LENGTH && mOnInputFinishListener != null) { mOnInputFinishListener.onInputFinish(text.toString()); } } public interface OnInputFinishListener { /** * 密码输入结束监听 * * @param password */ void onInputFinish(String password); } /** * 设置输入完成监听 * * @param onInputFinishListener */ public void setOnInputFinishListener( OnInputFinishListener onInputFinishListener) { this.mOnInputFinishListener = onInputFinishListener; }}
二、使用
public class InputBoxActivity extends AppCompatActivity { private PwdEditText et_pwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_inputbox); et_pwd= (PwdEditText) findViewById(R.id.et_pwd); et_pwd.setOnInputFinishListener(new PwdEditText.OnInputFinishListener() { @Override public void onInputFinish(String password) { Toast.makeText(InputBoxActivity.this, password,Toast.LENGTH_LONG).show(); } }); }}
三、xml中的length和password是设置密码框的个数和是否隐藏密码,它的引用需要自己在资源文件中定义
<com.example.testcostumview.inputbox.PwdEditText android:id="@+id/et_pwd" android:layout_width="200dp" android:layout_height="50dp" android:background="@android:color/transparent" android:cursorVisible="false" android:enabled="true" android:focusable="true" android:maxLength="4" app:length="4" app:password="false"/>
在res/values目录下新建一个attrs.xml,注意需要在根目录引入我们的命名空间xmlns:app=”http://schemas.android.com/apk/res-auto”,其中app我们可以更改,没有具体名字要求
<declare-styleable name="PwdEditText"> <attr name="length" format="integer"/> <attr name="password" format="boolean"/> declare-styleable>
在自定义PwdEditText中的使用
TypedArray array =context.obtainStyledAttributes(attrs , R.styleable.PwdEditText); isPassword=array.getBoolean(R.styleable.PwdEditText_password,false); pwdLegth=array.getInteger(R.styleable.PwdEditText_length,0);
更多相关文章
- androidの自定义控件View在Activity中使用findByViewId得到结果
- Android System Server大纲之LightsService
- Android 绘图进阶(四):自定义View属性(灰常重要)
- android 百度地图系列之地图初始化及定位
- Android framwork 分析之智能指针LightRefBase ,sp,wp,RefBase
- Android 怎么向打开的网页中自动填充用户名和密码?
- Android社交系统
- Android 与 H5 之间的互调