日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android自定義控件實現通用驗證碼輸入框

瀏覽:37日期:2022-09-21 08:00:54

本文為大家分享了Android實現通用驗證碼輸入框的具體代碼,供大家參考,具體內容如下

效果圖

話不多說先上效果圖,可以先先看看是不是自己想要的

Android自定義控件實現通用驗證碼輸入框

Android自定義控件實現通用驗證碼輸入框

閑聊

閑來無事優化項目時,發現原來的驗證碼輸入框,可擴展性不高,就拿來優化了一下,說說我開始的的思路吧,最開始是想用自定義View實現的,但是發現各種畫矩,太煩人了,最后采用的組合控件的形式,Android有現成的控件,用來組合組合就能用,為什么不用呢。

源碼

xml ITEM 布局文件(view_auth_code_input_item.xml)

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='match_parent' android:orientation='vertical'> <TextView android: android:layout_width='match_parent' android:layout_height='0mm' android:layout_weight='1' android:maxLength='1' android:text='0' android:textSize='72mm' /> <View android: android:layout_width='match_parent' android:layout_height='1mm' android:background='@color/colorMain' /></LinearLayout>

attrs 自定義屬性(attrs.xml)

<?xml version='1.0' encoding='utf-8'?><resources> <!-- 自定義驗證碼輸入框 屬性 --> <declare-styleable name='AuthCodeInputView'> <!-- 當前輸入位分割線顏色 --> <attr name='currentSplitLineColor' format='reference|color' /> <!-- 其他輸入位分割線顏色 --> <attr name='otherSplitLineColor' format='reference|color' /> <!-- 分割線高度 --> <attr name='splitLineHeight' format='dimension' /> <!-- 驗證碼位數 --> <attr name='digit' format='integer' /> <!-- 單個驗證碼寬度 --> <attr name='singleCaptchaWidth' format='dimension' /> <!-- 驗證碼當前輸入位字體顏色 --> <attr name='currentTextColor' format='reference|color' /> <!-- 驗證碼當前輸入位字體大小 --> <attr name='currentTextSize' format='dimension' /> <!-- 驗證碼其他輸入位字體顏色 --> <attr name='otherTextColor' format='reference|color' /> <!-- 驗證碼其它輸入位字體大小 --> <attr name='otherTextSize' format='dimension' /> <!-- 默認顏色 --> <attr name='defaultColor' format='reference|color' /> <!-- 默認字體大小 --> <attr name='defaultTextSize' format='dimension' /> <!-- 默認間距 --> <attr name='defaultSpacing' format='dimension' /> </declare-styleable></resources>

組合控件(AuthCodeInputView.java)

import android.content.Context;import android.content.res.TypedArray;import android.graphics.Color;import android.os.Build;import android.text.TextUtils;import android.util.AttributeSet;import android.util.TypedValue;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;import android.widget.TextView;import androidx.annotation.ColorInt;import androidx.annotation.RequiresApi;/** * <pre> * <b>author</b> :BraveTou * <b>blog</b> :https://blog.csdn.net/bravetou * <b>time</b> :2020/9/4 16:43 * <b>desc</b> :<pre> * 自定義驗證碼輸入框 * </pre> * </pre> */public class AuthCodeInputView extends LinearLayout { // <!-- 默認間距 --> private int mDefaultSpacing = 16; // <!-- 默認顏色 --> @ColorInt private int mDefaultColor = Color.BLACK; // <!-- 默認字體大小 --> private int mDefaultTextSize = 36; // <!-- 當前輸入位分割線顏色 --> @ColorInt private int mCurrentSplitLineColor = mDefaultColor; // <!-- 其他輸入位分割線顏色 --> @ColorInt private int mOtherSplitLineColor = mDefaultColor; // <!-- 分割線高度 --> private int mSplitLineHeight = 1; // <!-- 驗證碼位數 --> private int mDigit = 4; // <!-- 單個驗證碼寬度 --> private int mSingleCaptchaWidth = 100; // <!-- 驗證碼當前輸入位字體顏色 --> @ColorInt private int mCurrentTextColor = mDefaultColor; // <!-- 驗證碼當前輸入位字體大小 --> private int mCurrentTextSize = mDefaultTextSize; // <!-- 驗證碼其他輸入位字體顏色 --> @ColorInt private int mOtherTextColor = mDefaultColor; // <!-- 驗證碼其它輸入位字體大小 --> private int mOtherTextSize = mDefaultTextSize; // 記錄當前輸入文本 private String mText = ''; public AuthCodeInputView(Context context) { super(context); init(context, null); } public AuthCodeInputView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public AuthCodeInputView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public AuthCodeInputView(Context context, AttributeSet attrs, int defStyleAttr,int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context, attrs); } // 初始化 private void init(Context context, AttributeSet attrs) { setOrientation(LinearLayout.HORIZONTAL); setGravity(Gravity.CENTER); if (getChildCount() > 0) { removeAllViews(); } initAttrs(context, attrs); if (mDigit <= 0) { return; } for (int i = 0; i < mDigit; i++) { // 實例化 ITEM 組件 View child = LayoutInflater.from(context).inflate( R.layout.view_auth_code_input_item, this, false); LayoutParams lp = new LayoutParams(mSingleCaptchaWidth, ViewGroup.LayoutParams.MATCH_PARENT); if (i != 0) { lp.leftMargin = mDefaultSpacing; } child.setLayoutParams(lp); setViewAttrs(child, null, false); // 分割線高度只在初始化時設置一次 View mSplitV = child.findViewById(R.id.split_v); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, mSplitLineHeight); mSplitV.setLayoutParams(params); addView(child); } } // 設置(未)選中屬性 private void setViewAttrs(View child, String text, boolean isSelected) { TextView mNumberTv = child.findViewById(R.id.number_tv); View mSplitV = child.findViewById(R.id.split_v); if (isSelected) { mNumberTv.setTextColor(mCurrentTextColor); mNumberTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mCurrentTextSize); mSplitV.setBackgroundColor(mCurrentSplitLineColor); } else { mNumberTv.setTextColor(mOtherTextColor); mNumberTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mOtherTextSize); mSplitV.setBackgroundColor(mOtherSplitLineColor); } mNumberTv.setText(TextUtils.isEmpty(text) ? '' : text); } // 初始化屬性 private void initAttrs(Context context, AttributeSet attrs) { if (null != attrs) { // AttributeSet 屬性值的索引 TypedArray o = context.obtainStyledAttributes(attrs, R.styleable.AuthCodeInputView); // 默認間距 mDefaultSpacing = (int) o.getDimension(R.styleable.AuthCodeInputView_defaultSpacing, 16f); // 獲取默認顏色 mDefaultColor = o.getColor(R.styleable.AuthCodeInputView_defaultColor, Color.BLACK); // 獲取默認字體大小 mDefaultTextSize = (int) o.getDimension(R.styleable.AuthCodeInputView_defaultTextSize , 36f); // 輸入位分割線顏色 mCurrentSplitLineColor = o.getColor(R.styleable.AuthCodeInputView_currentSplitLineColor, mDefaultColor); // 其他輸入位分割線顏色 mOtherSplitLineColor = o.getColor(R.styleable.AuthCodeInputView_otherSplitLineColor, mDefaultColor); // 分割線高度 mSplitLineHeight = (int) o.getDimension(R.styleable.AuthCodeInputView_splitLineHeight , 1f); mSplitLineHeight = mSplitLineHeight <= 1 ? 1 : mSplitLineHeight; // 驗證碼位數 mDigit = o.getInteger(R.styleable.AuthCodeInputView_digit, 4); // 單個驗證碼寬度 mSingleCaptchaWidth = (int) o.getDimension(R.styleable.AuthCodeInputView_singleCaptchaWidth, 100f); // 驗證碼當前輸入位字體顏色 mCurrentTextColor = o.getColor(R.styleable.AuthCodeInputView_currentTextColor, mDefaultColor); // 驗證碼當前輸入位字體大小 mCurrentTextSize = (int) o.getDimension(R.styleable.AuthCodeInputView_currentTextSize , mDefaultTextSize); // 驗證碼其他輸入位字體顏色 mOtherTextColor = o.getColor(R.styleable.AuthCodeInputView_otherTextColor, mDefaultColor); // 驗證碼其它輸入位字體大小 mOtherTextSize = (int) o.getDimension(R.styleable.AuthCodeInputView_otherTextSize, mDefaultTextSize); // 回收資源 o.recycle(); } } // 追加文本 public void addText(String text) { text = TextUtils.isEmpty(text) ? '' : text; setText(mText + text); } // 刪除文本 public void delText() { int count = TextUtils.isEmpty(mText) ? 0 : mText.length(); if (count > 0) { setText(mText.substring(0, count - 1)); } else { setText(''); } } // 設置文本 public void setText(String text) { text = text.trim(); int length = TextUtils.isEmpty(text) ? 0 : text.length(); if (length > mDigit) { this.mText = text.substring(0, mDigit); length = mDigit; } else { this.mText = length > 0 ? text : ''; } int count = getChildCount(); for (int i = 0; i < count; i++) { View child = getChildAt(i); if (i + 1 < length) { setViewAttrs(child, String.valueOf(text.charAt(i)), false); } else if (i + 1 == length) { setViewAttrs(child, String.valueOf(text.charAt(i)), true); } else { setViewAttrs(child, null, false); } } } // 獲取文本 public String getText() { return mText; }}

至于效果圖下面那個安全鍵盤源碼就太多了,我就不多了的,我這邊是組合控件實現的,超簡單。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久的色偷偷| 日产欧产美韩系列久久99| 免费不卡中文字幕在线| 国产欧美高清| 中文字幕一区日韩精品| 久久aⅴ国产紧身牛仔裤| 黄色精品网站| 亚洲自拍另类| 婷婷视频一区二区三区| 日韩高清二区| 91九色综合| 国产乱码精品一区二区三区亚洲人| 日韩成人一级| 欧美极品中文字幕| 美女高潮久久久| 丰满少妇一区| 91亚洲国产| 精精国产xxxx视频在线野外| 久久理论电影| 五月天久久777| 午夜在线精品偷拍| 综合亚洲视频| 欧美亚洲网站| 精品一区91| 蜜桃视频在线网站| 精品一区三区| 亚洲一二av| 国产精品主播在线观看| 欧美国产美女| 精品一区欧美| 婷婷久久免费视频| 欧美激情亚洲| 婷婷激情一区| 国产精品毛片| 欧美日韩在线精品一区二区三区激情综合| 美日韩一区二区三区| 亚洲综合在线电影| 午夜在线播放视频欧美| 国产九九精品| 久久久久久免费视频| 亚洲婷婷丁香| 精品欧美日韩精品| 91久久久精品国产| 91成人在线网站| 日韩在线中文| 伊人久久一区| 国产精品v日韩精品v欧美精品网站| yellow在线观看网址| 久热精品在线| 久久99国产精品视频| 欧美精选一区二区三区| 日韩av在线免费观看不卡| а√在线中文在线新版| 免费看欧美美女黄的网站| 精品国产美女a久久9999| 99视频一区| 精品国产一区二区三区2021| 今天的高清视频免费播放成人| 日韩精品久久理论片| 亚洲黄色中文字幕| 亚洲视频二区| 国产一区二区三区视频在线| 国产99亚洲| 国产探花一区| 亚洲成人免费| 欧美激情久久久久久久久久久| 欧美二区视频| 国产精品视频一区二区三区四蜜臂| 久久精品国内一区二区三区水蜜桃| 综合色就爱涩涩涩综合婷婷| 水蜜桃久久夜色精品一区| 亚洲人成网站在线在线观看| 午夜久久中文| 国产伦精品一区二区三区在线播放| 亚洲女同一区| 国产一区二区三区视频在线| 麻豆精品91| av高清不卡| 国产日韩视频| 视频一区二区三区入口| 亚洲精品永久免费视频| 青青草国产精品亚洲专区无| 午夜欧美精品| 亚洲黄色中文字幕| 国产欧美日韩精品一区二区三区| 精品日韩毛片| 激情黄产视频在线免费观看| 国产亚洲电影| 亚洲一区二区三区中文字幕在线观看| 黑人精品一区| 国产精品白丝一区二区三区| 国产精品毛片一区二区三区| 国产日韩电影| 美女久久99| 91成人小视频| 亚洲精品看片| 中文精品在线| 欧美精品一区二区久久| 丁香六月综合| 精品日韩一区| 欧美交a欧美精品喷水| 日本免费新一区视频| 爽好久久久欧美精品| 激情欧美一区| 亚洲成人精品| 人在线成免费视频| 免费一区二区三区在线视频| 日韩一二三区在线观看| 中文在线一区| 女主播福利一区| 欧美美女一区| 99久久九九| 色婷婷狠狠五月综合天色拍| 成人在线观看免费视频| 国产精品草草| 国产欧美一区二区三区国产幕精品| 亚洲精品国产精品粉嫩| 日韩在线a电影| 夜夜嗨一区二区三区| 在线精品视频在线观看高清| 激情综合自拍| 亚洲婷婷免费| 欧美日韩国产免费观看视频| 免费黄色成人| 伊人影院久久| 中日韩男男gay无套| 国产视频久久| 首页欧美精品中文字幕| 免费一级片91| 日韩激情一区二区| 日韩激情视频网站| 日本视频在线一区| 欧美私人啪啪vps| 免费精品一区| 精品国产免费人成网站| 中文在线а√在线8| 中文另类视频| 久久免费国产| 亚洲国产欧美日本视频| 日韩一区精品视频| 电影亚洲精品噜噜在线观看| 精品国产欧美日韩| 国产在线观看91一区二区三区| 久久久久久自在自线| 日韩精品dvd| 999国产精品999久久久久久| 久久精品动漫| 中文精品视频| 69堂免费精品视频在线播放| 麻豆国产欧美日韩综合精品二区| 免费在线亚洲欧美| 神马午夜在线视频| 中国字幕a在线看韩国电影| 久久精品1区| 久久成人一区| 欧美久久亚洲| 中文在线免费视频| 午夜国产精品视频免费体验区| 亚洲丝袜美腿一区| 国产精品久久久网站| 国产一区2区| 激情欧美日韩一区| 亚洲精品第一| 成人在线免费观看网站| 欧美天堂亚洲电影院在线观看| 天堂俺去俺来也www久久婷婷| 欧美国产极品| 成人久久久久| 综合激情网站| 精品久久亚洲| 香蕉成人久久| 久久精品国产免费| 久久国产精品成人免费观看的软件| 久久性天堂网| 精品欧美视频| 久久99伊人| 岛国精品一区| 国产亚洲在线观看| 老司机精品视频在线播放| 私拍精品福利视频在线一区| 综合视频一区| 天堂av在线| 亚洲天堂av资源在线观看| 精品网站aaa| 丝瓜av网站精品一区二区| 国产一区二区三区四区五区| 久久午夜精品一区二区| 国内在线观看一区二区三区| 久久国产精品99国产| 麻豆国产精品视频| 亚洲欧美成人综合| 精品国产91| 亚欧洲精品视频在线观看| 麻豆理论在线观看| 日本成人中文字幕在线视频| 五月天av在线| 日韩高清不卡在线| 色天使综合视频| 国产欧美成人| 久久国产精品99国产|