Android程序開發(fā)之防止密碼輸入錯誤 密碼明文顯示功能
在使用App的時候,首次登錄都需要用戶輸入密碼的,有些朋友為了安全起見密碼設(shè)置的比較長,導(dǎo)致很多次密碼都輸入錯誤,嚴(yán)重影響了用戶體驗效果。這一點移動開發(fā)者做好了準(zhǔn)備工作,因為手機的私密性比較強,在輸入密碼的時候,可以顯示輸入,增強準(zhǔn)確性,提升用戶體驗度。這當(dāng)然要付出代價的,需要額外的代碼編寫功能。下面通過本文給大家介紹如何編寫密碼明文顯示的功能,僅供參考。
本文源碼的GitHub下載地址
要點
(1) 重寫EditText, 添加提示密碼顯示和隱藏的圖片.
(2) 判斷點擊位置, 切換EditText的密碼顯示狀態(tài).
(3) 在屏幕旋轉(zhuǎn)或配置改變時, 保留圖片的狀態(tài)信息.
實現(xiàn)只有一個類和兩個圖片資源, 大家可以自由定制.
1. 布局樣式
兩種密碼的顯示樣式, 一種是常規(guī)顯示, 一種是TextInputLayout顯示.
<LinearLayout android:id="@+id/main_ll_container_1" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密碼:" android:textSize="20sp"/> <me.chunyu.spike.wcl_password_input_demo.PasswordEditText android: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.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/main_ll_container_1"> <me.chunyu.spike.wcl_password_input_demo.PasswordEditText android: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è)置Icon mShowPwdIcon = 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() { @Override public 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)聽事件
點擊圖片, 切換顯示或隱藏密碼, 獲取點擊位置, 和圖片位置進行比較, 判斷事件.
@Override public boolean onTouchEvent(MotionEvent event) { if (mDrawableSide == null) { return super.onTouchEvent(event); } final Rect bounds = mDrawableSide.getBounds(); final int x = (int) event.getRawX(); // 點擊的位置 int iconX = (int) getTopRightCorner().x; // Icon的位置 int leftIcon = iconX - bounds.width(); Log.e(TAG, "x: " + x + ", leftIcon: " + leftIcon); // 大于Icon的位置, 才能觸發(fā)點擊 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; } @Override public 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)用中, 更換圖片資源, 替換顯示密碼框, 給用戶更好的移動端體驗. 永遠追求極致, 追求不凡.
關(guān)于Android程序開發(fā)之防止密碼輸入錯誤 密碼明文顯示功能的相關(guān)知識就給大家介紹到這里,希望對大家有所幫助!
相關(guān)文章
Android實現(xiàn)快速滾動FastScrollView效果
這篇文章主要介紹了Android實現(xiàn)快速滾動FastScrollView效果,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08Android發(fā)送xml數(shù)據(jù)給服務(wù)器的方法
這篇文章主要介紹了Android發(fā)送xml數(shù)據(jù)給服務(wù)器的方法,以實例形式較為詳細的分析了Android發(fā)送XML數(shù)據(jù)及接收XML數(shù)據(jù)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09