在使用App的時候,首次登錄都需要用戶輸入密碼的,有些朋友為了安全起見密碼設(shè)置的比較長,導(dǎo)致很多次密碼都輸入錯誤,嚴(yán)重影響了用戶體驗(yàn)效果。這一點(diǎn)移動開發(fā)者做好了準(zhǔn)備工作,因?yàn)槭謾C(jī)的私密性比較強(qiáng),在輸入密碼的時候,可以顯示輸入,增強(qiáng)準(zhǔn)確性,提升用戶體驗(yàn)度。這當(dāng)然要付出代價的,需要額外的代碼編寫功能。下面通過本文給大家介紹如何編寫密碼明文顯示的功能,僅供參考。

本文源碼的GitHub下載地址
要點(diǎn)
(1) 重寫EditText, 添加提示密碼顯示和隱藏的圖片.
(2) 判斷點(diǎn)擊位置, 切換EditText的密碼顯示狀態(tài).
(3) 在屏幕旋轉(zhuǎn)或配置改變時, 保留圖片的狀態(tài)信息.
實(shí)現(xiàn)只有一個類和兩個圖片資源, 大家可以自由定制.
1. 布局樣式
兩種密碼的顯示樣式, 一種是常規(guī)顯示, 一種是TextInputLayout顯示.
<LinearLayoutandroid:id="@+id/main_ll_container_1"android:layout_width="match_parent"android:layout_height="40dp"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="密碼:"android:textSize="20sp"/><me.chunyu.spike.wcl_password_input_demo.PasswordEditTextandroid:id="@+id/main_pet_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:hint="請輸入密碼"/></LinearLayout><android.support.design.widget.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/main_ll_container_1"><me.chunyu.spike.wcl_password_input_demo.PasswordEditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:hint="請輸入密碼"/></android.support.design.widget.TextInputLayout>
效果

2. 提示圖標(biāo)
初始化資源和布局, 獲取密碼圖片的資源, 監(jiān)聽EditText, 有文字時顯示圖標(biāo), 沒有文字時隱藏圖標(biāo).
// 初始化布局public void initFields(AttributeSet attrs, int defStyleAttr) {if (attrs != null) {// 獲取屬性信息TypedArray styles = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.PasswordEditText, defStyleAttr, 0);try {// 根據(jù)參數(shù), 設(shè)置IconmShowPwdIcon = styles.getResourceId(R.styleable.PasswordEditText_pet_iconShow, mShowPwdIcon);mHidePwdIcon = styles.getResourceId(R.styleable.PasswordEditText_pet_iconHide, mHidePwdIcon);} finally {styles.recycle();}}// 密碼狀態(tài)setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Override public void onTextChanged(CharSequence s, int start, int before, int count) {if (s.length() > 0) {// 有文字時顯示指示器showPasswordVisibilityIndicator(true);} else {mIsShowPwdIcon = false;restorePasswordIconVisibility(mIsShowPwdIcon);showPasswordVisibilityIndicator(false); // 隱藏指示器}}@Override public void afterTextChanged(Editable s) {}});}setInputType設(shè)置密碼狀態(tài), TYPE_TEXT_VARIATION_PASSWORD密文狀態(tài).
通過pet_iconShow屬性, 可以選擇自定義密碼提示圖片.
3. 監(jiān)聽事件
點(diǎn)擊圖片, 切換顯示或隱藏密碼, 獲取點(diǎn)擊位置, 和圖片位置進(jìn)行比較, 判斷事件.
@Override public boolean onTouchEvent(MotionEvent event) {if (mDrawableSide == null) {return super.onTouchEvent(event);}final Rect bounds = mDrawableSide.getBounds();final int x = (int) event.getRawX(); // 點(diǎn)擊的位置int iconX = (int) getTopRightCorner().x;// Icon的位置int leftIcon = iconX - bounds.width();Log.e(TAG, "x: " + x + ", leftIcon: " + leftIcon);// 大于Icon的位置, 才能觸發(fā)點(diǎn)擊if (x >= leftIcon) {togglePasswordIconVisibility(); // 變換狀態(tài)event.setAction(MotionEvent.ACTION_CANCEL);return false;}return super.onTouchEvent(event);}切換明文或密文的密碼
// 設(shè)置密碼指示器的狀態(tài)private void restorePasswordIconVisibility(boolean isShowPwd) {if (isShowPwd) {// 可視密碼輸入setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);} else {// 非可視密碼狀態(tài)setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);}// 移動光標(biāo)setSelection(getText().length());}4. 保存狀態(tài)
重寫SavedState, 在旋轉(zhuǎn)屏幕時, 保存和恢復(fù)顯示圖片信息.
// 存儲密碼狀態(tài), 顯示Icon的位置protected static class PwdSavedState extends BaseSavedState {private final boolean mShowingIcon;private PwdSavedState(Parcelable superState, boolean showingIcon) {super(superState);mShowingIcon = showingIcon;}private PwdSavedState(Parcel in) {super(in);mShowingIcon = in.readByte() != 0;}public boolean isShowingIcon() {return mShowingIcon;}@Overridepublic void writeToParcel(Parcel destination, int flags) {super.writeToParcel(destination, flags);destination.writeByte((byte) (mShowingIcon ? 1 : 0));}public static final Parcelable.Creator<PwdSavedState> CREATOR = new Creator<PwdSavedState>() {public PwdSavedState createFromParcel(Parcel in) {return new PwdSavedState(in);}public PwdSavedState[] newArray(int size) {return new PwdSavedState[size];}};}動畫效果

現(xiàn)在可以把類復(fù)制到應(yīng)用中, 更換圖片資源, 替換顯示密碼框, 給用戶更好的移動端體驗(yàn). 永遠(yuǎn)追求極致, 追求不凡.
關(guān)于Android程序開發(fā)之防止密碼輸入錯誤 密碼明文顯示功能的相關(guān)知識就給大家介紹到這里,希望對大家有所幫助!
新聞熱點(diǎn)
疑難解答
圖片精選