国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 自定義密碼輸入框實現代碼

2019-10-22 18:14:20
字體:
來源:轉載
供稿:網友

效果

自定義密碼輸入框,項目的一個界面需求,我把這個自定義的輸入框提取出來作為這次內容的題目。

輸入前:

android,自定義,輸入框,密碼輸入框

輸入后:

android,自定義,輸入框,密碼輸入框

輸入1個字符就紅一個圈圈,很簡單的效果。

思路

1.自定義EditText。

2.背景為一個外圓環(huán)加內實心圓。

3.edittext的長度變化時候重新繪制背景或者紅色環(huán)位置。

關鍵代碼

代碼其實也很簡單,順手拿資源的請到文末。

1.畫背景

/**   * 繪制背景外圓   */  private void drawOutRing(Canvas canvas) {    mPaint.setColor(mBgColor);    // 設置畫筆為空心    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.畫實心內圓背景

/**   * 繪制背景內圓   */  private void drawInRing(Canvas canvas) {    mPaint.setColor(mDivisionLineColor);    // 設置畫筆為實心    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);    // 畫實心內圓    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);    // 設置畫筆為空心    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);    // 繪制背景內圓    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.還可以設置些屬性

在sytle中設置,通過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>

完整代碼

一些樣式,我設置了,結果直接沒用上

<declare-styleable name="PasswordView">    <!-- 密碼的個數 -->    <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;  // 密碼的個數默認為6位數  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);    // 設置輸入模式是密碼    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 轉 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);    // 繪制背景內圓    drawInRing(canvas);    // 繪制密碼    drawHidePassword(canvas);  }  @Override  public void setText(CharSequence text, BufferType type) {    super.setText(text, type);  }  /**   * 繪制背景外圓   */  private void drawOutRing(Canvas canvas) {    mPaint.setColor(mBgColor);    // 設置畫筆為空心    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);    // 設置畫筆為實心    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);    // 設置畫筆為空心    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 * outRingLineSize + i * mPasswordItemWidth + mPasswordItemWidth / 2 + mBgSize;      canvas.drawCircle(cx, getHeight() / 2, mOutRadius, mPaint);    }  }  /**   * 繪制背景內圓   */  private void drawInRing(Canvas canvas) {    mPaint.setColor(outRingLineColor);    // 設置畫筆為實心    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);    }  }}

總結

以上所述是小編給大家介紹的Android 自定義密碼輸入框實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桦南县| 康乐县| 南澳县| 南召县| 斗六市| 怀安县| 霍山县| 西林县| 军事| 陆良县| 泉州市| 永修县| 长沙市| 潮安县| 潜江市| 伊春市| 肃宁县| 会泽县| 拜泉县| 都匀市| 依兰县| 奈曼旗| 雷山县| 黑山县| 恩施市| 宜良县| 麦盖提县| 福建省| 沧源| 海晏县| 广宁县| 涟源市| 郎溪县| 吉隆县| 鸡西市| 安阳县| 宣威市| 宣威市| 田阳县| 丹阳市| 兴隆县|