這篇文章給大家介紹Android中怎么自定義一個密碼輸入框,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、賓陽ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的賓陽網(wǎng)站制作公司
思路
1.自定義EditText。
2.背景為一個外圓環(huán)加內(nèi)實心圓。
3.edittext的長度變化時候重新繪制背景或者紅色環(huán)位置。
關(guān)鍵代碼
代碼其實也很簡單,順手拿資源的請到文末。
1.畫背景
/** * 繪制背景外圓 */ private void drawOutRing(Canvas canvas) { mPaint.setColor(mBgColor); // 設(shè)置畫筆為空心 mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mBgSize); RectF rectF = new RectF(mBgSize, mBgSize, getWidth() - mBgSize, getHeight() - mBgSize); // 畫圓 for (int i = 0; i < mPasswordNumber; i++) { int cx = i * mDivisionLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize; canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint); } }
2.畫實心內(nèi)圓背景
/** * 繪制背景內(nèi)圓 */ private void drawInRing(Canvas canvas) { mPaint.setColor(mDivisionLineColor); // 設(shè)置畫筆為實心 mPaint.setStyle(Paint.Style.FILL); // 畫圈圈 for (int i = 0; i < mPasswordNumber; i++) { int cx = i * mDivisionLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize; canvas.drawCircle(cx, getHeight() / 2, mPasswordRadius, mPaint); } } }
3.繪制輸入密碼的變化動作
/** * 繪制隱藏的密碼 */ private void drawHidePassword(Canvas canvas) { int passwordLength = getText().length(); if (passwordLength > 6) passwordLength = 6; mPaint.setColor(mPasswordColor); // 畫實心內(nèi)圓 mPaint.setStyle(Paint.Style.FILL); for (int i = 0; i < passwordLength; i++) { int cx = i * mDivisionLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize; canvas.drawCircle(cx, getHeight() / 2, mPasswordRadius, mPaint); } //外圓顏色 mPaint.setColor(mPasswordColor); // 設(shè)置畫筆為空心 mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mBgSize); RectF rectF = new RectF(mBgSize, mBgSize, getWidth() - mBgSize, getHeight() - mBgSize); // 畫空心外圓 for (int i = 0; i < passwordLength; i++) { int cx = i * mDivisionLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize; canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint); } }
4.重寫onDraw
int passwordWidth = getWidth() - (mPasswordNumber - 1) * mDivisionLineSize; mPasswordItemWidth = passwordWidth / mPasswordNumber; // 繪制背景外圓 drawOutRing(canvas); // 繪制背景內(nèi)圓 drawInRing(canvas); // 繪制密碼 drawHidePassword(canvas);
5.xml引用
<com***.PasswordView android:id="@+id/password" android:layout_width="240dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="10dp" android:background="@null"> </com***.PasswordView>
6.還可以設(shè)置些屬性
在sytle中設(shè)置,通過xml中的app:xxx引用。
<com.*.PasswordView android:id="@+id/password" android:layout_width="240dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="10dp" xmlns:app="http://schemas.android.com/apk/res-auto" app:bgColor="#ffffff" android:background="@null"> </com.*.PasswordView>
完整代碼
一些樣式,我設(shè)置了,結(jié)果直接沒用上
<declare-styleable name="PasswordView"> <!-- 密碼的個數(shù) --> <attr name="passwordNumber" format="integer"/> <!-- 密碼圓點的半徑 --> <attr name="passwordRadius" format="dimension"/> <!-- 密碼圓點的顏色 --> <attr name="passwordColor" format="color"/> <!-- 外圈顏色 --> <attr name="outRingColor" format="color"/> <!-- 外圓線條大小 --> <attr name="outRingLineSize" format="color"/> <!-- 背景邊框的顏色 --> <attr name="bgColor" format="color"/> <!-- 背景邊框的大小 --> <attr name="bgSize" format="dimension"/> <!-- 背景邊框的圓角大小 --> <attr name="bgCorner" format="dimension"/> </declare-styleable>
自定義Edittext
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.TypedValue; import android.view.inputmethod.EditorInfo; import android.widget.EditText; /** *自定義密碼輸入框 */ public class PasswordView extends EditText { // 畫筆 private Paint mPaint; // 一個密碼所占的寬度 private int mPasswordItemWidth; // 密碼的個數(shù)默認為6位數(shù) private int mPasswordNumber = 6; // 背景圓顏色 private int mBgColor = Color.parseColor("#d1d2d6"); // 背景大小 private int mBgSize = 1; // 背景邊框圓角大小 private int mBgCorner = 0; // 外圓的顏色 private int outRingLineColor = mBgColor; // 外圓線條的大小 private int outRingLineSize = 1; // 密碼輸入的顏色 private int mPasswordColor = Color.parseColor("#cb3435"); // 密碼圓點的半徑大小 private int mPasswordRadius = 6; // 外圓半徑大小 private int mOutRadius = 25; public PasswordView(Context context) { this(context, null); } public PasswordView(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); initAttributeSet(context, attrs); // 設(shè)置輸入模式是密碼 setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD); // 不顯示光標 setCursorVisible(false); } /** * 初始化屬性 */ private void initAttributeSet(Context context, AttributeSet attrs) { TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.PasswordView); // 獲取大小 outRingLineSize = (int) array.getDimension(R.styleable.PasswordView_outRingLineSize, dip2px(outRingLineSize)); mPasswordRadius = (int) array.getDimension(R.styleable.PasswordView_passwordRadius, dip2px(mPasswordRadius)); mBgSize = (int) array.getDimension(R.styleable.PasswordView_bgSize, dip2px(mBgSize)); mBgCorner = (int) array.getDimension(R.styleable.PasswordView_bgCorner, 0); // 獲取顏色 mBgColor = array.getColor(R.styleable.PasswordView_bgColor, mBgColor); outRingLineColor = array.getColor(R.styleable.PasswordView_outRingColor, outRingLineColor); mPasswordColor = array.getColor(R.styleable.PasswordView_passwordColor, mPasswordColor); array.recycle(); } /** * 初始化畫筆 */ private void initPaint() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); } /** * dip 轉(zhuǎn) px */ private int dip2px(int dip) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, getResources().getDisplayMetrics()); } @Override protected void onDraw(Canvas canvas) { int passwordWidth = getWidth() - (mPasswordNumber - 1) * outRingLineSize; mPasswordItemWidth = passwordWidth / mPasswordNumber; // 繪制背景外圓 drawOutRing(canvas); // 繪制背景內(nèi)圓 drawInRing(canvas); // 繪制密碼 drawHidePassword(canvas); } @Override public void setText(CharSequence text, BufferType type) { super.setText(text, type); } /** * 繪制背景外圓 */ private void drawOutRing(Canvas canvas) { mPaint.setColor(mBgColor); // 設(shè)置畫筆為空心 mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mBgSize); RectF rectF = new RectF(mBgSize, mBgSize, getWidth() - mBgSize, getHeight() - mBgSize); // 畫圓 for (int i = 0; i < mPasswordNumber; i++) { int cx = i * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize; canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint); } } /** * 繪制隱藏的密碼 */ private void drawHidePassword(Canvas canvas) { int passwordLength = getText().length(); if (passwordLength > 6) passwordLength = 6; mPaint.setColor(mPasswordColor); // 設(shè)置畫筆為實心 mPaint.setStyle(Paint.Style.FILL); for (int i = 0; i < passwordLength; i++) { int cx = i * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize; canvas.drawCircle(cx, getHeight() / 2, mPasswordRadius, mPaint); } //外圓 mPaint.setColor(mPasswordColor); // 設(shè)置畫筆為空心 mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mBgSize); RectF rectF = new RectF(mBgSize, mBgSize, getWidth() - mBgSize, getHeight() - mBgSize); // 如果沒有設(shè)置圓角,就畫矩形 for (int i = 0; i < passwordLength; i++) { int cx = i * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize; canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint); } } /** * 繪制背景內(nèi)圓 */ private void drawInRing(Canvas canvas) { mPaint.setColor(outRingLineColor); // 設(shè)置畫筆為實心 mPaint.setStyle(Paint.Style.FILL); // 畫圈圈 for (int i = 0; i < mPasswordNumber; i++) { int cx = i * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize; canvas.drawCircle(cx, getHeight() / 2, mPasswordRadius, mPaint); } } }
關(guān)于Android中怎么自定義一個密碼輸入框就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
名稱欄目:Android中怎么自定義一個密碼輸入框
本文鏈接:http://jinyejixie.com/article6/gdpsig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、企業(yè)建站、網(wǎng)站改版、響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)