Android自定義實現(xiàn)一個車牌字母選擇鍵盤
在一般和車相關(guān)的應(yīng)用,難免會和車牌打交道,組成車牌的要素,國內(nèi)無非就是省份簡稱+地區(qū)代碼+英文或者數(shù)字組成,比如京A12345,在需要輸入車牌的功能上,就需要有省份簡稱鍵盤和英文數(shù)字鍵盤了,在上篇的文章《Android自定義一個省份簡稱鍵盤》,總結(jié)了省份簡稱鍵盤的實現(xiàn),本篇我們繼續(xù)完成英文和數(shù)字鍵盤的實現(xiàn)。
今天的內(nèi)容大致如下:
1、最終實現(xiàn)效果及簡單分析
2、設(shè)置屬性,制定可擴展效果
3、部分源碼剖析
4、開源地址及使用總結(jié)
一、最終實現(xiàn)效果及簡單分析
以上就是本篇文章最終要實現(xiàn)的效果,和省份簡稱鍵盤不同的是,數(shù)據(jù)源上和邊距有所差別之外,其他的實現(xiàn)方式均是一樣的,采用外部垂直LinearLayout,內(nèi)部多個橫向的LinearLayout的搭配方式。
需要注意的是,英文和數(shù)字鍵盤,默認(rèn)狀態(tài)下,頂部的數(shù)字是禁止的,也就是輸入完地區(qū)代碼之后,數(shù)字的禁止?fàn)顟B(tài)才會釋放;由于距離左右的邊距不同,其在數(shù)據(jù)源的判斷上也會有不同,這個也是需要注意的。
二、設(shè)置屬性,制定可擴展效果
其相關(guān)屬性和上篇的省份鍵盤基本上沒有太大的出入,主要就是動態(tài)化設(shè)置,設(shè)置一些,文字的背景,大小,顏色以及格子之間的編輯等,大概羅列了以下屬性:
屬性 | 類型 | 概述 |
---|---|---|
ek_background | color | 整體的背景顏色 |
ek_rect_spacing | dimension | 格子的邊距 |
ek_rect_height | dimension | 格子的高度 |
ek_rect_margin_top | dimension | 格子的距離上邊 |
ek_margin_left_right | dimension | 左右距離 |
ek_margin_top | dimension | 上邊距離 |
ek_margin_bottom | dimension | 下邊距離 |
ek_rect_background | reference | 格子的背景 |
ek_rect_select_background | reference | 格子選擇后的背景 |
ek_rect_text_size | dimension | 格子的文字大小 |
ek_rect_text_color | color | 格子的文字顏色 |
ek_rect_select_text_color | color | 格子的文字選中顏色 |
ek_is_show_complete | boolean | 是否顯示完成按鈕 |
ek_complete_text_size | dimension | 完成按鈕文字大小 |
ek_complete_text_color | color | 完成按鈕文字顏色 |
ek_complete_text | string | 完成按鈕文字內(nèi)容 |
ek_complete_margin_top | dimension | 完成按鈕距離上邊 |
ek_complete_margin_bottom | dimension | 完成按鈕距離下邊 |
ek_complete_margin_right | dimension | 完成按鈕距離右邊 |
ek_other_lines_margin | dimension | 其他行邊距 |
ek_is_num_prohibit | boolean | 數(shù)字是否禁止 |
ek_text_prohibit_color | color | 數(shù)字禁止顏色 |
ek_text_click_effect | boolean | 是否觸發(fā)點擊效果,true點擊后背景消失,false不消失 |
設(shè)置回調(diào)函數(shù)
方法 | 概述 |
---|---|
keyboardContent | 獲取點擊的省份簡稱簡稱信息 |
keyboardDelete | 刪除省份簡稱簡稱信息 |
keyboardComplete | 鍵盤點擊完成 |
openProhibit | 打開禁止(使領(lǐng)學(xué)港澳),使其可以點擊 |
三、部分源碼剖析
這里只貼出部分的關(guān)鍵性代碼,整體的代碼,大家滑到底部查看源碼地址即可。
定義字母和數(shù)字?jǐn)?shù)組
private val mEnglishList = arrayListOf( "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "Q", "W", "E", "R", "T", "Y", "U", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M" )
定義遍歷數(shù)字和字母
由于在數(shù)據(jù)源上使用的是同一個,那么需要做截取分別進行遍歷,便于控制左右的邊距和本身的格子大小。
//遍歷數(shù)字 eachData(mEnglishList.subList(0, 10), mLength, true) //遍歷字母 eachData(mEnglishList.subList(10, mEnglishList.size), mLength - 1, false) //追加最后一個刪除按鈕View,動態(tài)計算寬度 addEndView(mLineLayout)
遍歷數(shù)據(jù)
遍歷數(shù)據(jù)的邏輯和上篇保持一致,當(dāng)和定義的長度取模為0時,就需要換行,換行就是重新創(chuàng)建一個水平的LinearLayout,添加至垂直的LinearLayout之中,需要做判斷的是,左右的邊距。
/** * AUTHOR:AbnerMing * INTRODUCE:遍歷數(shù)據(jù) */ private fun eachData( list: List<String>, len: Int, isNumber: Boolean = false ) { list.forEachIndexed { index, s -> if (index % len == 0) { //重新創(chuàng)建,并添加View mLineLayout = createLinearLayout() mLineLayout?.weightSum = len.toFloat() addView(mLineLayout) val params = mLineLayout?.layoutParams as LayoutParams params.apply { topMargin = mRectMarginTop.toInt() height = mRectHeight.toInt() if (isNumber) { //是數(shù)字 leftMargin = mMarginLeftRight.toInt() rightMargin = mMarginLeftRight.toInt() - mSpacing.toInt() } else { //是字母 leftMargin = mOtherLinesMargin.toInt() rightMargin = mOtherLinesMargin.toInt() - mSpacing.toInt() } mLineLayout?.layoutParams = this } } //創(chuàng)建文字視圖 val textView = TextView(context).apply { text = s //設(shè)置文字的屬性 textSize = px2sp(mRectTextSize) //禁止 if (isNumber) { //是數(shù)字 if (mNumProhibit) { setTextColor(mRectTextColor) } else { setTextColor(mNumProhibitColor) } } else { setTextColor(mRectTextColor) } setBackgroundResource(mRectBackGround) gravity = Gravity.CENTER setOnClickListener { //每個格子的點擊事件 if (isNumber && !mNumProhibit) { //如果是數(shù)字,根據(jù)規(guī)則暫時不觸發(fā)點擊 return@setOnClickListener } changeTextViewState(this) } } //是數(shù)字 if (isNumber) { mTempTextViewList.add(textView) } addRectView(textView, mLineLayout, 1f) } }
添加視圖
設(shè)置每個格子的寬高和權(quán)重。
/** * AUTHOR:AbnerMing * INTRODUCE:追加視圖 */ private fun addRectView(view: View, layout: LinearLayout?, w: Float) { layout?.addView(view) val textParams = view.layoutParams as LayoutParams textParams.apply { weight = w width = 0 height = LayoutParams.MATCH_PARENT //每行的最后一個 rightMargin = mSpacing.toInt() view.layoutParams = this } }
至于最后一個刪除按鈕,也需要動態(tài)的計算其本身的寬高,基本上和上篇一致,就不過多贅述了。
四、開源地址及使用總結(jié)
開源地址:github.com/AbnerMing888/EnglishKeyboardView
關(guān)于如何使用,有兩種方式,一種是下載源碼,直接把源碼復(fù)制出來,二是可以使用以下的遠程Maven依賴方式。
Maven具體調(diào)用
1、在你的根項目下的build.gradle文件下,引入maven。
allprojects { repositories { maven { url "https://gitee.com/AbnerAndroid/almighty/raw/master" } } }
2、在你需要使用的Module中build.gradle文件下,引入依賴。
dependencies { implementation 'com.vip:board:1.0.0' }
代碼使用
<com.vip.board.EnglishKeyboardView android:layout_width="match_parent" android:layout_height="wrap_content" />
總結(jié)
屬性配置了有很多,可以實現(xiàn)多種自定義的相關(guān)效果,大家可以查找第二項中的屬性介紹,進行自定義配置,還是那句話,本身的實現(xiàn)方式有很多種,本篇只是其中的一個簡單的案例,僅供大家作為一個參考。
自定義英文和數(shù)字鍵盤,大家有沒有發(fā)現(xiàn)了少了一個字母,為什么會沒有這個字母呢?你知道原因嗎?
以上就是Android自定義實現(xiàn)一個車牌字母選擇鍵盤的詳細(xì)內(nèi)容,更多關(guān)于Android鍵盤的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android中l(wèi)istview嵌套scrollveiw沖突的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中l(wèi)istview嵌套scrollveiw沖突的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Adnroid 自定義ProgressDialog加載中(加載圈)
這篇文章主要介紹了Adnroid 自定義ProgressDialog加載中(加載圈),需要的朋友可以參考下2017-06-06Android基于Fresco實現(xiàn)圓角和圓形圖片
這篇文章主要為大家詳細(xì)介紹了Android基于Fresco實現(xiàn)圓角和圓形圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04Android自定義view實現(xiàn)帶header和footer的Layout
這篇文章主要介紹了Android自定義view實現(xiàn)帶header和footer的Layout,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02Android創(chuàng)建服務(wù)之started service詳細(xì)介紹
這篇文章主要介紹了Android創(chuàng)建服務(wù)之started service,需要的朋友可以參考下2014-02-02Android自定義ImageView實現(xiàn)圓角功能
這篇文章主要為大家詳細(xì)介紹了Android自定義ImageView實現(xiàn)圓角功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12Android?JetPack組件的支持庫Databinding詳解
DataBinding是Google發(fā)布的一個數(shù)據(jù)綁定框架,它能夠讓開發(fā)者減少重復(fù)性非常高的代碼,如findViewById這樣的操作。其核心優(yōu)勢是解決了數(shù)據(jù)分解映射到各個view的問題,在MVVM框架中,實現(xiàn)的View和Viewmode的雙向數(shù)據(jù)綁定2022-08-08