android 實現(xiàn)密碼輸入框動態(tài)明文/密文切換顯示

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

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

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

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

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

  1. getCompoundDrawables();獲得EditText迈勋,left,top,right,bottom四個方向上的drawable,這里我們主要關(guān)注right方向的醋粟。
  2. setCompoundDrawables();為EditText設(shè)置四個方向的drawable靡菇。注意,設(shè)置之前必須指定drawable的邊界大小米愿,draw的時候會使用到這個值厦凤,如果不設(shè)置,圖標將不會被畫出來育苟。
  3. 設(shè)置EditText的inputype的一種方法较鼓,這個type有好幾種類型可以根據(jù)需要決定使用哪種

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

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

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

setTransformationMethod(TransformationMethod method);文本內(nèi)容的一些單行违柏,點點點(密碼)顯示效果都是由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) {
    //指定了默認的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四個方向的drawable
    Drawable[] compoundDrawables = getCompoundDrawables();
    visibilityDrawable = compoundDrawables[2];
    if (visibilityDrawable == null) {
        visibilityDrawable = getResources().getDrawable(R.drawable.ic_visibility_off_black_24dp);
    }
}

/**
 * 用按下的位置來模擬點擊事件
 * 當按下的點的位置 在  EditText的寬度 - (圖標到控件右邊的間距 + 圖標的寬度)  和
 * EditText的寬度 - 圖標到控件右邊的間距 之間就模擬點擊事件闲孤,
 */
@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;
            //得到用戶的點擊位置,模擬點擊事件
            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());
                }

                //將光標定位到指定的位置
                CharSequence text = this.getText();
                if (text instanceof Spannable) {
                    Spannable spanText = (Spannable) text;
                    Selection.setSelection(spanText, text.length());
                }
                //調(diào)用setCompoundDrawables方法時烤礁,必須要為drawable指定大小讼积,不然不會顯示在界面上
                visibilityDrawable.setBounds(0, 0, visibilityDrawable.getMinimumWidth(),
                        visibilityDrawable.getMinimumHeight());
                setCompoundDrawables(getCompoundDrawables()[0],
                        getCompoundDrawables()[1], visibilityDrawable, getCompoundDrawables()[3]);
            }
        }
    }
    return super.onTouchEvent(event);
 }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脚仔,隨后出現(xiàn)的幾起案子勤众,更是在濱河造成了極大的恐慌,老刑警劉巖鲤脏,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件们颜,死亡現(xiàn)場離奇詭異吕朵,居然都是意外死亡,警方通過查閱死者的電腦和手機窥突,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門努溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阻问,你說我怎么就攤上這事梧税。” “怎么了称近?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵第队,是天一觀的道長。 經(jīng)常有香客問我刨秆,道長凳谦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任衡未,我火速辦了婚禮尸执,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眠屎。我一直安慰自己剔交,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布改衩。 她就那樣靜靜地躺著岖常,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葫督。 梳的紋絲不亂的頭發(fā)上竭鞍,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音橄镜,去河邊找鬼偎快。 笑死,一個胖子當著我的面吹牛洽胶,可吹牛的內(nèi)容都是我干的晒夹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼姊氓,長吁一口氣:“原來是場噩夢啊……” “哼丐怯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翔横,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤读跷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后禾唁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體效览,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡无切,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丐枉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哆键。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矛洞,靈堂內(nèi)的尸體忽然破棺而出洼哎,到底是詐尸還是另有隱情,我是刑警寧澤沼本,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布噩峦,位于F島的核電站,受9級特大地震影響抽兆,放射性物質(zhì)發(fā)生泄漏识补。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一辫红、第九天 我趴在偏房一處隱蔽的房頂上張望凭涂。 院中可真熱鬧,春花似錦贴妻、人聲如沸切油。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澎胡。三九已至,卻和暖如春娩鹉,著一層夾襖步出監(jiān)牢的瞬間攻谁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工弯予, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戚宦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓锈嫩,卻偏偏與公主長得像受楼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呼寸,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容