摘要:在項(xiàng)目中遇到需要提供給用戶一個(gè)密碼輸入框明文/密文切換顯示的需求,今天給大家分享下Android 實(shí)現(xiàn)密碼輸入框動(dòng)態(tài)明文/密文切換顯示效果在項(xiàng)目中遇到需要提供給用戶一個(gè)密碼輸入框明文/密文切換顯示的需求,在網(wǎng)上搜索一圈都沒有發(fā)現(xiàn)完整的實(shí)現(xiàn),幸而找到了一個(gè)實(shí)現(xiàn)的思路。先上效果圖,看了錄制屏幕gif的教程,無奈手機(jī)太舊系統(tǒng)版本不支持,只有上靜態(tài)圖了。密碼輸入框動(dòng)態(tài)明文/密文切換顯示當(dāng)看到這個(gè)效果圖的時(shí)
在項(xiàng)目中遇到需要提供給用戶一個(gè)密碼輸入框明文/密文切換顯示的需求,今天給大家分享下Android 實(shí)現(xiàn)密碼輸入框動(dòng)態(tài)明文/密文切換顯示效果
在項(xiàng)目中遇到需要提供給用戶一個(gè)密碼輸入框明文/密文切換顯示的需求,在網(wǎng)上搜索一圈都沒有發(fā)現(xiàn)完整的實(shí)現(xiàn),幸而找到了一個(gè)實(shí)現(xiàn)的思路。
先上效果圖,看了錄制屏幕gif的教程,無奈手機(jī)太舊系統(tǒng)版本不支持,只有上靜態(tài)圖了。
密碼輸入框動(dòng)態(tài)明文/密文切換顯示
當(dāng)看到這個(gè)效果圖的時(shí)候,相信你已經(jīng)猜到大概的思路了。沒錯(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)。通過自定義EditText可以很簡單的實(shí)現(xiàn),這個(gè)時(shí)候第一只攔路虎就出來,EditText的四個(gè)方向的Drawable并沒有可以設(shè)置如按鈕點(diǎn)擊一樣的監(jiān)聽listener。此時(shí),我們只能通過模擬點(diǎn)擊來達(dá)到效果了。主要是通過EditText的onTouchEvent的方法來判斷手指抬起時(shí)的點(diǎn)的坐標(biāo)是否位于drawableRight區(qū)域內(nèi),如果位于,我們就執(zhí)行動(dòng)態(tài)改變圖片和inputType的操作。我這里判斷規(guī)則很簡單,點(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ì)被畫出來。
設(shè)置EditText的inputype的一種方法,這個(gè)type有好幾種類型可以根據(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());顯示密文密碼
接下來就直接貼代碼了,思路已經(jīng)理清楚了,代碼注釋也很全。相信應(yīng)該沒有什么大的問題了。
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); } } /** * 用按下的位置來模擬點(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); } }
更多關(guān)于Android 實(shí)現(xiàn)密碼輸入框動(dòng)態(tài)明文/密文切換顯示效果請(qǐng)關(guān)注PHP中文網(wǎng)(ipnx.cn)其他文章!