欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義PasswordInputView密碼輸入

 更新時間:2018年08月21日 11:58:50   作者:天外來客1009  
這篇文章主要為大家詳細介紹了Android自定義PasswordInputView密碼輸入功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

歡迎來到“實現(xiàn)自定義密碼輸入控件”這一章節(jié),PasswordInputView定義了密碼輸入的監(jiān)聽,支持直接在布局文件定義屬性值、支持直接獲取密碼輸入的長度、原始密碼……

先上圖

PasswordInputView是做什么的?

PasswordInputView是一個自定義密碼輸入的控件,類似支付寶、微信支付的密碼輸入,同時定義了密碼輸入的監(jiān)聽,支持直接在布局文件定義屬性值、支持直接獲取密碼輸入的長度、原始密碼等,還可以擴展其他方法,請自行實現(xiàn)。

實現(xiàn)原理

1.創(chuàng)建一個類 ‘PasswordInputView' ,讓其繼承EditText,因為我們要實現(xiàn)的自定義view是用來密碼輸入的,所以必須繼承EditText。

2.為了在布局(layout)文件(.xml)能直接定義PasswordInputView各個屬性的值,我們需要定義PasswordInputView帶AttributeSet 參數(shù)的構(gòu)造方法。

public PasswordInputView(Context context, AttributeSet attr) {
  super(context, attr);
  init(context, attr);
}

3.在'value/attrs.xml'中定義PasswordInputView各個屬性及其類型,如:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="Passwordinputview">
    <attr name="passwordLength" format="integer"/>
    <attr name="borderWidth" format="dimension"/>
    <attr name="borderRadius" format="dimension"/>
    <attr name="borderColor" format="color"/>
    <attr name="passwordWidth" format="dimension"/>
    <attr name="passwordColor" format="color"/>
  </declare-styleable>
</resources>

4.重載OnDraw(Canvas canvas)方法,并在其實現(xiàn)畫邊框、畫內(nèi)容區(qū)域(以填充模式繪制Paint.Style.FILL)、畫分割線、畫實心圓點(密碼)。有人可能會問:畫了邊框、分割線,就可以了,為什么還要畫內(nèi)容區(qū)域?問得好,筆者在實現(xiàn)過程中也碰到這個問題,當時沒有畫內(nèi)容區(qū)域,導致輸入的原始內(nèi)容也顯示出來了(如下異常圖),所以畫內(nèi)容區(qū)域(以填充模式繪制Paint.Style.FILL)是為了掩蓋原始內(nèi)容不被發(fā)現(xiàn),切記必不可少。

正確代碼如下:

 private void init(Context context, AttributeSet attr) {
  TypedArray ta = context.obtainStyledAttributes(attr, R.styleable.Passwordinputview);
  try {
   passwordLength = ta.getInt(R.styleable.Passwordinputview_passwordLength, passwordLength);
   borderWidth = ta.getDimensionPixelSize(R.styleable.Passwordinputview_borderWidth, borderWidth);
   borderRadius = ta.getDimensionPixelSize(R.styleable.Passwordinputview_borderRadius, borderRadius);
   borderColor = ta.getColor(R.styleable.Passwordinputview_borderColor, borderColor);
   passwordWidth = ta.getDimensionPixelSize(R.styleable.Passwordinputview_passwordWidth, passwordWidth);
   passwordColor = ta.getColor(R.styleable.Passwordinputview_passwordColor, passwordColor);
  } catch (Exception e) {

  }
  ta.recycle();

  borderPaint = new Paint();
  borderPaint.setAntiAlias(true);
  borderPaint.setColor(borderColor);
  borderPaint.setStrokeWidth(borderWidth);
  borderPaint.setStyle(Paint.Style.FILL); //以填充模式來畫,防止原始輸入內(nèi)容顯示出來

  passwordPaint = new Paint();
  passwordPaint.setAntiAlias(true);
  passwordPaint.setColor(passwordColor);
  passwordPaint.setStrokeWidth(passwordWidth);
 }

 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  super.onDraw(canvas);
  int width = getWidth();
  int height = getHeight();

  //畫邊框
  RectF rect = new RectF(0, 0, width, height);
  borderPaint.setColor(borderColor);
  canvas.drawRoundRect(rect, borderRadius, borderRadius, borderPaint);

  //畫內(nèi)容區(qū)域,與上面的borderPaint.setStyle(Paint.Style.FILL)對應, 防止原始輸入內(nèi)容顯示出來
  RectF rectContent = new RectF(rect.left + defaultContentMargin, rect.top + defaultContentMargin, rect.right - defaultContentMargin, rect.bottom - defaultContentMargin);
  borderPaint.setColor(Color.WHITE);
  canvas.drawRoundRect(rectContent, borderRadius, borderRadius, borderPaint);

  //畫分割線:分割線數(shù)量比密碼數(shù)少1
  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);
  }

  //畫密碼內(nèi)容
  float px, py = height / 2;
  float halfWidth = width / passwordLength / 2;
  for (int i = 0; i < textLength; i++) {
   px = width * i / passwordLength + halfWidth;
   canvas.drawCircle(px, py, passwordWidth, passwordPaint);
  }
}

5.定義“設置屬性值”的方法,如下

public void setBorderWidth(int borderWidth) {
 this.borderWidth = borderWidth;
 borderPaint.setStrokeWidth(borderWidth);
 postInvalidate();
}

動態(tài)圖

項目源碼

點此鏈接

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 聊聊GridView實現(xiàn)拖拽排序及數(shù)據(jù)交互的問題

    聊聊GridView實現(xiàn)拖拽排序及數(shù)據(jù)交互的問題

    這篇文章主要介紹了聊聊GridView實現(xiàn)拖拽排序及數(shù)據(jù)交互的問題,整體實現(xiàn)思路是通過在一個容器里放置兩個dragview,DragView里面進行View的動態(tài)交換以及數(shù)據(jù)交換,具體實現(xiàn)代碼跟隨小編一起看看吧
    2021-11-11
  • 淺析Android文件存儲

    淺析Android文件存儲

    本文詳細介紹了android的外部存儲和私有存儲。大家在有保存文件的需求的時候,根據(jù)自己的需要,選擇到底是存在哪里比較合適。內(nèi)部存儲相對較小,不介意把一些大文件存在其中。應該存在外部存儲會更好。對于可以給其他文件訪問的,可以存在外部存儲的公有文件里面
    2021-06-06
  • Android實現(xiàn)實時滑動ViewPager的2種方式

    Android實現(xiàn)實時滑動ViewPager的2種方式

    這篇文章主要為大家詳細介紹了Android實現(xiàn)實時滑動ViewPager的2種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 詳解Android MVP開發(fā)模式

    詳解Android MVP開發(fā)模式

    這篇文章主要為大家介紹了Android MVP開發(fā)模式的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Android開發(fā)之開關(guān)按鈕用法示例

    Android開發(fā)之開關(guān)按鈕用法示例

    這篇文章主要介紹了Android開發(fā)之開關(guān)按鈕用法,結(jié)合實例形式分析了Android開關(guān)按鈕的具體實現(xiàn)、布局與功能設置相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • android實現(xiàn)可上下回彈的scrollview

    android實現(xiàn)可上下回彈的scrollview

    這篇文章主要為大家詳細介紹了android實現(xiàn)可上下回彈的scrollview,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android仿新浪微博發(fā)送菜單界面的實現(xiàn)

    Android仿新浪微博發(fā)送菜單界面的實現(xiàn)

    這篇文章主要介紹了Android仿新浪微博發(fā)送菜單界面的實現(xiàn),幫助大家更好的理解和學習使用Android開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • Android學習筆記--通過Application傳遞數(shù)據(jù)代碼示例

    Android學習筆記--通過Application傳遞數(shù)據(jù)代碼示例

    使用Application傳遞數(shù)據(jù)步驟如下:創(chuàng)建新class,取名MyApp,繼承android.app.Application父類,并在MyApp中定義需要保存的屬性
    2013-06-06
  • 深入Understanding Android ContentProvider詳解

    深入Understanding Android ContentProvider詳解

    本篇文章是對Android ContentProvider進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Android 中 android.view.WindowLeaked的解決辦法

    Android 中 android.view.WindowLeaked的解決辦法

    這篇文章主要介紹了Android 中 android.view.WindowLeaked的解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論