密碼輸入框

帶有右側(cè)點(diǎn)擊圖片顯示和隱藏密碼的功能.

 <com.yuanin.aimifinance.view.PasswordEditText
            android:id="@+id/etPwd"
            style="@style/passwordEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/small_margin"
            android:background="@mipmap/login_edittext_bg"
            android:drawableLeft="@mipmap/login_password"
            android:drawablePadding="@dimen/margin_eight"
            android:gravity="center_vertical"
            android:hint="@string/input_login_password"
            android:paddingLeft="@dimen/margin_eight"
            android:paddingRight="@dimen/margin_eight"
            android:textColor="@color/text_black"
            android:textColorHint="@color/text_light_gray"
            android:textSize="@dimen/normal_text"/>
public class PasswordEditText extends EditText implements View.OnFocusChangeListener,
        TextWatcher {
    //EditText右側(cè)的眼睛按鈕
    private Drawable mHideDrawable, mShowDrawable, mCurrentDrawable;
    private boolean hasFoucs;
    private boolean isShowPwd = false;

    public PasswordEditText(Context context) {
        this(context, null);
    }

    public PasswordEditText(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.editTextStyle);
    }

    public PasswordEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        // 獲取EditText的DrawableRight,假如沒有設(shè)置我們就使用默認(rèn)的圖片,獲取圖片的順序是左上右下(0,1,2,3,)
        mHideDrawable = getResources().getDrawable(
                R.mipmap.login_hide_pwd);
        mShowDrawable = getResources().getDrawable(
                R.mipmap.login_show_pwd);
        mHideDrawable.setBounds(0, 0, mHideDrawable.getIntrinsicWidth(),
                mHideDrawable.getIntrinsicHeight()+10);

        mCurrentDrawable = mHideDrawable;
        // 默認(rèn)設(shè)置隱藏圖標(biāo)
        setClearIconVisible(false);
        // 設(shè)置焦點(diǎn)改變的監(jiān)聽
        setOnFocusChangeListener(this);
        // 設(shè)置輸入框里面內(nèi)容發(fā)生改變的監(jiān)聽
        addTextChangedListener(this);
    }

    /* *@說明:isInnerWidth, isInnerHeight為ture盒粮,觸摸點(diǎn)在刪除圖標(biāo)之內(nèi)嚷闭,則視為點(diǎn)擊了刪除圖標(biāo)
     * event.getX() 獲取相對(duì)應(yīng)自身左上角的X坐標(biāo)
     * event.getY() 獲取相對(duì)應(yīng)自身左上角的Y坐標(biāo)
     * getWidth() 獲取控件的寬度
     * getHeight() 獲取控件的高度
     * getTotalPaddingRight() 獲取刪除圖標(biāo)左邊緣到控件右邊緣的距離
     * getPaddingRight() 獲取刪除圖標(biāo)右邊緣到控件右邊緣的距離
     * isInnerWidth:
     *  getWidth() - getTotalPaddingRight() 計(jì)算刪除圖標(biāo)左邊緣到控件左邊緣的距離
     *  getWidth() - getPaddingRight() 計(jì)算刪除圖標(biāo)右邊緣到控件左邊緣的距離
     * isInnerHeight:
     *  distance 刪除圖標(biāo)頂部邊緣到控件頂部邊緣的距離
     *  distance + height 刪除圖標(biāo)底部邊緣到控件頂部邊緣的距離
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (getCompoundDrawables()[2] != null) {
                int x = (int) event.getX();
                int y = (int) event.getY();
                Rect rect = getCompoundDrawables()[2].getBounds();
                int height = rect.height();
                int distance = (getHeight() - height) / 2;
                boolean isInnerWidth = x > (getWidth() - getTotalPaddingRight()) && x < (getWidth() - getPaddingRight());
                boolean isInnerHeight = y > distance && y < (distance + height);
                if (isInnerWidth && isInnerHeight) {
                    if (isShowPwd) {
                        //設(shè)置EditText文本為隱藏的
                        this.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                        mHideDrawable.setBounds(0, 0, mHideDrawable.getIntrinsicWidth(),
                                mHideDrawable.getIntrinsicHeight()+10);
                        mCurrentDrawable = mHideDrawable;
                        setClearIconVisible(true);
                    } else {
                        //設(shè)置EditText文本為可見的
                        this.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                        mShowDrawable.setBounds(0, 0, mShowDrawable.getIntrinsicWidth(),
                                mShowDrawable.getIntrinsicHeight()+10);
                        mCurrentDrawable = mShowDrawable;
                        setClearIconVisible(true);
                    }
                    isShowPwd = !isShowPwd;
                    this.setSelection(TextUtils.isEmpty(this.getText()) ? 0 : this.length());//光標(biāo)挪到最后
                }
            }
        }
        return super.onTouchEvent(event);
    }

    /**
     * 當(dāng)ClearEditText焦點(diǎn)發(fā)生變化的時(shí)候,
     * 輸入長度為零卤恳,隱藏刪除圖標(biāo)鳞滨,否則洞焙,顯示刪除圖標(biāo)
     */
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        this.hasFoucs = hasFocus;
    }

    protected void setClearIconVisible(boolean visible) {
        Drawable right = visible ? mCurrentDrawable : null;
        setCompoundDrawables(getCompoundDrawables()[0],
                getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int count, int after) {
        if (hasFoucs) {
            setClearIconVisible(s.length() > 0);
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
                                  int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }


}

<style name="passwordEditText">
        <item name="android:inputType">textPassword</item>
        <item name="android:maxLength">16</item>
</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拯啦,隨后出現(xiàn)的幾起案子澡匪,更是在濱河造成了極大的恐慌,老刑警劉巖褒链,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唁情,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡甫匹,警方通過查閱死者的電腦和手機(jī)甸鸟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兵迅,“玉大人抢韭,你說我怎么就攤上這事』屑” “怎么了刻恭?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扯夭。 經(jīng)常有香客問我鳍贾,道長,這世上最難降的妖魔是什么勉抓? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任贾漏,我火速辦了婚禮候学,結(jié)果婚禮上藕筋,老公的妹妹穿的比我還像新娘。我一直安慰自己梳码,他們只是感情好隐圾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掰茶,像睡著了一般暇藏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上濒蒋,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天盐碱,我揣著相機(jī)與錄音把兔,去河邊找鬼。 笑死瓮顽,一個(gè)胖子當(dāng)著我的面吹牛县好,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暖混,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼缕贡,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了拣播?” 一聲冷哼從身側(cè)響起晾咪,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贮配,沒想到半個(gè)月后谍倦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泪勒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年剂跟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酣藻。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曹洽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辽剧,到底是詐尸還是另有隱情送淆,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布怕轿,位于F島的核電站偷崩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏撞羽。R本人自食惡果不足惜阐斜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诀紊。 院中可真熱鬧谒出,春花似錦、人聲如沸邻奠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碌宴。三九已至杀狡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贰镣,已是汗流浹背呜象。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工膳凝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恭陡。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓鸠项,卻偏偏與公主長得像,于是被迫代替她去往敵國和親子姜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祟绊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 歡迎Follow我的GitHub, 關(guān)注我的簡書. 其余參考Android目錄. 本文的合集已經(jīng)編著成書,高級(jí)An...
    SpikeKing閱讀 11,899評(píng)論 2 51
  • 支付類應(yīng)用通常都需要輸入6位支付密碼哥捕,有的是用 AlertView 的方式實(shí)現(xiàn)的牧抽,例如在 iPhone的 App ...
    獨(dú)木舟的木閱讀 945評(píng)論 0 3
  • 本文為Android自定義View系列,難度不大遥赚,都是些坐標(biāo)的計(jì)算扬舒,閱讀本文大概需要5分鐘。 Demo效果圖 分析...
    EoniJJ閱讀 7,420評(píng)論 10 38
  • 早起的憂傷 盡管80%以上的早起快一年凫佛,今天連續(xù)早起94天讲坎,在早起的效能上,還是充滿濃濃憂傷愧薛。就我而言晨炕,精力充...
    卷Jane閱讀 119評(píng)論 0 0
  • 因?yàn)橄∩伲哉滟F毫炉。 因?yàn)闇嘏屠酰陨岵坏谩?因?yàn)橄胍Γ砸x開瞄勾。
    減肥的女孩閱讀 262評(píng)論 0 2