国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android程序開發(fā)之防止密碼輸入錯誤 密碼明文顯示功能

2020-04-11 10:47:09
字體:
供稿:網(wǎng)友

在使用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)然要付出代價的,需要額外的代碼編寫功能。下面通過本文給大家介紹如何編寫密碼明文顯示的功能,僅供參考。

Password

本文源碼的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)知識就給大家介紹到這里,希望對大家有所幫助!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 营口市| 安泽县| 鸡泽县| 大宁县| 深圳市| 张家界市| 大关县| 大埔县| 陕西省| 望谟县| 青河县| 南城县| 从化市| 潞西市| 都江堰市| 武功县| 灵山县| 柏乡县| 定州市| 荥经县| 翁源县| 灵丘县| 虹口区| 大连市| 乐至县| 大关县| 乐都县| 邳州市| 玉林市| 化州市| 万宁市| 都昌县| 宣恩县| 新津县| 石首市| 九台市| 永泰县| 昭通市| 田林县| 衡东县| 林州市|