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

Android 實(shí)現(xiàn)密碼輸入框動(dòng)態(tài)明文/密文切換顯示效果

 更新時(shí)間:2017年01月09日 15:50:32   作者:綠色水杯007  
在項(xiàng)目中遇到需要提供給用戶一個(gè)密碼輸入框明文/密文切換顯示的需求,今天小編借腳本之家平臺(tái)給大家分享下Android 實(shí)現(xiàn)密碼輸入框動(dòng)態(tài)明文/密文切換顯示效果,需要的朋友參考下

在項(xiàng)目中遇到需要提供給用戶一個(gè)密碼輸入框明文/密文切換顯示的需求,在網(wǎng)上搜索一圈都沒(méi)有發(fā)現(xiàn)完整的實(shí)現(xiàn),幸而找到了一個(gè)實(shí)現(xiàn)的思路。

先上效果圖,看了錄制屏幕gif的教程,無(wú)奈手機(jī)太舊系統(tǒng)版本不支持,只有上靜態(tài)圖了。

密碼輸入框動(dòng)態(tài)明文/密文切換顯示

當(dāng)看到這個(gè)效果圖的時(shí)候,相信你已經(jīng)猜到大概的思路了。沒(méi)錯(cuò)就是為我們的EditText設(shè)置drawableRight,圖中的眼睛圖片還有一個(gè)配對(duì)的,是從martial designde的網(wǎng)站下載的,當(dāng)用戶點(diǎn)擊drawableRight時(shí),先動(dòng)態(tài)的改變drawable,其次,再改變EditText的inputType,就能實(shí)現(xiàn)的我們的目標(biāo)。通過(guò)自定義EditText可以很簡(jiǎn)單的實(shí)現(xiàn),這個(gè)時(shí)候第一只攔路虎就出來(lái),EditText的四個(gè)方向的Drawable并沒(méi)有可以設(shè)置如按鈕點(diǎn)擊一樣的監(jiān)聽(tīng)listener。此時(shí),我們只能通過(guò)模擬點(diǎn)擊來(lái)達(dá)到效果了。主要是通過(guò)EditText的onTouchEvent的方法來(lái)判斷手指抬起時(shí)的點(diǎn)的坐標(biāo)是否位于drawableRight區(qū)域內(nèi),如果位于,我們就執(zhí)行動(dòng)態(tài)改變圖片和inputType的操作。我這里判斷規(guī)則很簡(jiǎn)單,點(diǎn)坐標(biāo)的x值大于EditText的寬度 - (圖標(biāo)的寬度+圖標(biāo)的padding+圖標(biāo)到控件的右邊距),并且x的值小于 EditText的寬度 - 圖片到控件的右邊距,為了精確你可以加上Y軸方向的判斷。

幾個(gè)關(guān)鍵的方法:

getCompoundDrawables();獲得EditText,left,top,right,bottom四個(gè)方向上的drawable,這里我們主要關(guān)注right方向的。

setCompoundDrawables();為EditText設(shè)置四個(gè)方向的drawable。注意,設(shè)置之前必須指定drawable的邊界大小,draw的時(shí)候會(huì)使用到這個(gè)值,如果不設(shè)置,圖標(biāo)將不會(huì)被畫(huà)出來(lái)。

設(shè)置EditText的inputype的一種方法,這個(gè)type有好幾種類(lèi)型可以根據(jù)需要決定使用哪種

this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);密文密碼
this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); 明文密碼

4 明文密文的另一種實(shí)現(xiàn)方式。

setTransformationMethod(TransformationMethod method);文本內(nèi)容的一些單行,點(diǎn)點(diǎn)點(diǎn)(密碼)顯示效果都是由TransformationMethod指定的。

this.setTransformationMethod(HideReturnsTransformationMethod.getInstance());顯示明文密碼
this.setTransformationMethod(PasswordTransformationMethod.getInstance());顯示密文密碼

接下來(lái)就直接貼代碼了,思路已經(jīng)理清楚了,代碼注釋也很全。相信應(yīng)該沒(méi)有什么大的問(wèn)題了。

public class TogglePasswordVisibilityEditText extends EditText {
//切換drawable的引用
private Drawable visibilityDrawable;
private boolean visibililty = false;
public TogglePasswordVisibilityEditText(Context context) {
 this(context, null);
}
public TogglePasswordVisibilityEditText(Context context, AttributeSet attrs) {
 //指定了默認(rèn)的style屬性
 this(context, attrs, android.R.attr.editTextStyle);
}
public TogglePasswordVisibilityEditText(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init();
}
private void init() {
 //獲得該EditText的left ,top ,right,bottom四個(gè)方向的drawable
 Drawable[] compoundDrawables = getCompoundDrawables();
 visibilityDrawable = compoundDrawables[2];
 if (visibilityDrawable == null) {
  visibilityDrawable = getResources().getDrawable(R.drawable.ic_visibility_off_black_24dp);
 }
}
/**
 * 用按下的位置來(lái)模擬點(diǎn)擊事件
 * 當(dāng)按下的點(diǎn)的位置 在 EditText的寬度 - (圖標(biāo)到控件右邊的間距 + 圖標(biāo)的寬度) 和
 * EditText的寬度 - 圖標(biāo)到控件右邊的間距 之間就模擬點(diǎn)擊事件,
 */
@Override
public boolean onTouchEvent(MotionEvent event) {
 int action = event.getAction();
 if (action == MotionEvent.ACTION_UP) {
  if (getCompoundDrawables()[2] != null) {
   boolean xFlag = false;
   boolean yFlag = false;
   //得到用戶的點(diǎn)擊位置,模擬點(diǎn)擊事件
   xFlag = event.getX() > getWidth() - (visibilityDrawable.getIntrinsicWidth() + getCompoundPaddingRight
     ()) &&
     event.getX() < getWidth() - (getTotalPaddingRight() - getCompoundPaddingRight());
   if (xFlag) {
    visibililty = !visibililty;
    if (visibililty) {
     visibilityDrawable = getResources().getDrawable(R.drawable.ic_visibility_black_24dp);
     /*this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);*/
     this.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
    } else {
     //隱藏密碼
     visibilityDrawable = getResources().getDrawable(R.drawable.ic_visibility_off_black_24dp);
     //this.setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
     this.setTransformationMethod(PasswordTransformationMethod.getInstance());
    }
    //將光標(biāo)定位到指定的位置
    CharSequence text = this.getText();
    if (text instanceof Spannable) {
     Spannable spanText = (Spannable) text;
     Selection.setSelection(spanText, text.length());
    }
    //調(diào)用setCompoundDrawables方法時(shí),必須要為drawable指定大小,不然不會(huì)顯示在界面上
    visibilityDrawable.setBounds(0, 0, visibilityDrawable.getMinimumWidth(),
      visibilityDrawable.getMinimumHeight());
    setCompoundDrawables(getCompoundDrawables()[0],
      getCompoundDrawables()[1], visibilityDrawable, getCompoundDrawables()[3]);
   }
  }
 }
 return super.onTouchEvent(event);
 }
}

以上所述是小編給大家介紹的Android 實(shí)現(xiàn)密碼輸入框動(dòng)態(tài)明文/密文切換顯示效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Android APP性能優(yōu)化分析

    Android APP性能優(yōu)化分析

    這篇文章主要給大家講了Android APP性能優(yōu)化相關(guān)的思考以及優(yōu)化重點(diǎn)分析,需要的朋友參考下吧。
    2017-12-12
  • 詳解Android的Handler機(jī)制原理

    詳解Android的Handler機(jī)制原理

    Android的Handler機(jī)制是一種用于處理和調(diào)度線程之間消息傳遞的機(jī)制,通常用于在后臺(tái)線程中執(zhí)行任務(wù),并將結(jié)果返回到主線程中更新UI,Handler機(jī)制的核心是Message和MessageQueue,以及Looper,本文給大家詳細(xì)講解了Android的Handler機(jī)制原理,需要的朋友可以參考下
    2023-10-10
  • Android實(shí)現(xiàn)懸浮可拖拽的Button

    Android實(shí)現(xiàn)懸浮可拖拽的Button

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)懸浮可拖拽的Button,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Android開(kāi)發(fā)人臉識(shí)別統(tǒng)計(jì)人臉數(shù)

    Android開(kāi)發(fā)人臉識(shí)別統(tǒng)計(jì)人臉數(shù)

    這篇文章主要介紹了Android開(kāi)發(fā)人臉識(shí)別統(tǒng)計(jì)人臉數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Android通過(guò)滑動(dòng)實(shí)現(xiàn)Activity跳轉(zhuǎn)(手勢(shì)識(shí)別器應(yīng)用)

    Android通過(guò)滑動(dòng)實(shí)現(xiàn)Activity跳轉(zhuǎn)(手勢(shì)識(shí)別器應(yīng)用)

    這篇文章主要為大家詳細(xì)介紹了Android通過(guò)滑動(dòng)實(shí)現(xiàn)Activity跳轉(zhuǎn),,講解手勢(shì)識(shí)別器應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 關(guān)于Kotlin委托你必須重視的幾個(gè)點(diǎn)

    關(guān)于Kotlin委托你必須重視的幾個(gè)點(diǎn)

    委托模式已經(jīng)被證明是實(shí)現(xiàn)繼承的一個(gè)很好的替代方式,下面這篇文章主要給大家介紹了關(guān)于Kotlin委托你必須重視的幾個(gè)點(diǎn),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • Android中自定義ContentProvider實(shí)例

    Android中自定義ContentProvider實(shí)例

    應(yīng)用A(TestBaidu)調(diào)用另外一個(gè)應(yīng)用(TestContentProvider)即自定義ContentProvider的使用,其它應(yīng)用調(diào)用該ContentProvider,具體如下,感興趣的朋友可以參考下哈
    2013-06-06
  • 最新評(píng)論