Android自定義實(shí)現(xiàn)一個(gè)車牌字母選擇鍵盤(pán)
在一般和車相關(guān)的應(yīng)用,難免會(huì)和車牌打交道,組成車牌的要素,國(guó)內(nèi)無(wú)非就是省份簡(jiǎn)稱+地區(qū)代碼+英文或者數(shù)字組成,比如京A12345,在需要輸入車牌的功能上,就需要有省份簡(jiǎn)稱鍵盤(pán)和英文數(shù)字鍵盤(pán)了,在上篇的文章《Android自定義一個(gè)省份簡(jiǎn)稱鍵盤(pán)》,總結(jié)了省份簡(jiǎn)稱鍵盤(pán)的實(shí)現(xiàn),本篇我們繼續(xù)完成英文和數(shù)字鍵盤(pán)的實(shí)現(xiàn)。
今天的內(nèi)容大致如下:
1、最終實(shí)現(xiàn)效果及簡(jiǎn)單分析
2、設(shè)置屬性,制定可擴(kuò)展效果
3、部分源碼剖析
4、開(kāi)源地址及使用總結(jié)
一、最終實(shí)現(xiàn)效果及簡(jiǎn)單分析

以上就是本篇文章最終要實(shí)現(xiàn)的效果,和省份簡(jiǎn)稱鍵盤(pán)不同的是,數(shù)據(jù)源上和邊距有所差別之外,其他的實(shí)現(xiàn)方式均是一樣的,采用外部垂直LinearLayout,內(nèi)部多個(gè)橫向的LinearLayout的搭配方式。
需要注意的是,英文和數(shù)字鍵盤(pán),默認(rèn)狀態(tài)下,頂部的數(shù)字是禁止的,也就是輸入完地區(qū)代碼之后,數(shù)字的禁止?fàn)顟B(tài)才會(huì)釋放;由于距離左右的邊距不同,其在數(shù)據(jù)源的判斷上也會(huì)有不同,這個(gè)也是需要注意的。
二、設(shè)置屬性,制定可擴(kuò)展效果
其相關(guān)屬性和上篇的省份鍵盤(pán)基本上沒(méi)有太大的出入,主要就是動(dòng)態(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ā)點(diǎn)擊效果,true點(diǎn)擊后背景消失,false不消失 |
設(shè)置回調(diào)函數(shù)
| 方法 | 概述 |
|---|---|
| keyboardContent | 獲取點(diǎn)擊的省份簡(jiǎn)稱簡(jiǎn)稱信息 |
| keyboardDelete | 刪除省份簡(jiǎn)稱簡(jiǎn)稱信息 |
| keyboardComplete | 鍵盤(pán)點(diǎn)擊完成 |
| openProhibit | 打開(kāi)禁止(使領(lǐng)學(xué)港澳),使其可以點(diǎn)擊 |
三、部分源碼剖析
這里只貼出部分的關(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ù)源上使用的是同一個(gè),那么需要做截取分別進(jìn)行遍歷,便于控制左右的邊距和本身的格子大小。
//遍歷數(shù)字
eachData(mEnglishList.subList(0, 10), mLength, true)
//遍歷字母
eachData(mEnglishList.subList(10, mEnglishList.size), mLength - 1, false)
//追加最后一個(gè)刪除按鈕View,動(dòng)態(tài)計(jì)算寬度
addEndView(mLineLayout)遍歷數(shù)據(jù)
遍歷數(shù)據(jù)的邏輯和上篇保持一致,當(dāng)和定義的長(zhǎng)度取模為0時(shí),就需要換行,換行就是重新創(chuàng)建一個(gè)水平的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 {
//每個(gè)格子的點(diǎn)擊事件
if (isNumber && !mNumProhibit) {
//如果是數(shù)字,根據(jù)規(guī)則暫時(shí)不觸發(fā)點(diǎn)擊
return@setOnClickListener
}
changeTextViewState(this)
}
}
//是數(shù)字
if (isNumber) {
mTempTextViewList.add(textView)
}
addRectView(textView, mLineLayout, 1f)
}
}添加視圖
設(shè)置每個(gè)格子的寬高和權(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
//每行的最后一個(gè)
rightMargin = mSpacing.toInt()
view.layoutParams = this
}
}至于最后一個(gè)刪除按鈕,也需要?jiǎng)討B(tài)的計(jì)算其本身的寬高,基本上和上篇一致,就不過(guò)多贅述了。
四、開(kāi)源地址及使用總結(jié)
開(kāi)源地址:github.com/AbnerMing888/EnglishKeyboardView
關(guān)于如何使用,有兩種方式,一種是下載源碼,直接把源碼復(fù)制出來(lái),二是可以使用以下的遠(yuǎn)程Maven依賴方式。
Maven具體調(diào)用
1、在你的根項(xiàng)目下的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é)
屬性配置了有很多,可以實(shí)現(xiàn)多種自定義的相關(guān)效果,大家可以查找第二項(xiàng)中的屬性介紹,進(jìn)行自定義配置,還是那句話,本身的實(shí)現(xiàn)方式有很多種,本篇只是其中的一個(gè)簡(jiǎn)單的案例,僅供大家作為一個(gè)參考。
自定義英文和數(shù)字鍵盤(pán),大家有沒(méi)有發(fā)現(xiàn)了少了一個(gè)字母,為什么會(huì)沒(méi)有這個(gè)字母呢?你知道原因嗎?
以上就是Android自定義實(shí)現(xiàn)一個(gè)車牌字母選擇鍵盤(pán)的詳細(xì)內(nèi)容,更多關(guān)于Android鍵盤(pán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android中l(wèi)istview嵌套scrollveiw沖突的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中l(wèi)istview嵌套scrollveiw沖突的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Adnroid 自定義ProgressDialog加載中(加載圈)
這篇文章主要介紹了Adnroid 自定義ProgressDialog加載中(加載圈),需要的朋友可以參考下2017-06-06
Android基于Fresco實(shí)現(xiàn)圓角和圓形圖片
這篇文章主要為大家詳細(xì)介紹了Android基于Fresco實(shí)現(xiàn)圓角和圓形圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android自定義view實(shí)現(xiàn)帶header和footer的Layout
這篇文章主要介紹了Android自定義view實(shí)現(xiàn)帶header和footer的Layout,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02
Android創(chuàng)建服務(wù)之started service詳細(xì)介紹
這篇文章主要介紹了Android創(chuàng)建服務(wù)之started service,需要的朋友可以參考下2014-02-02
Android自定義ImageView實(shí)現(xiàn)圓角功能
這篇文章主要為大家詳細(xì)介紹了Android自定義ImageView實(shí)現(xiàn)圓角功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android個(gè)人手機(jī)通訊錄開(kāi)發(fā)詳解
在本篇文章里小編給大家分享了關(guān)于Android個(gè)人手機(jī)通訊錄開(kāi)發(fā)的步驟和相關(guān)源碼,有需要的朋友們學(xué)習(xí)下。2019-02-02
Android?JetPack組件的支持庫(kù)Databinding詳解
DataBinding是Google發(fā)布的一個(gè)數(shù)據(jù)綁定框架,它能夠讓開(kāi)發(fā)者減少重復(fù)性非常高的代碼,如findViewById這樣的操作。其核心優(yōu)勢(shì)是解決了數(shù)據(jù)分解映射到各個(gè)view的問(wèn)題,在MVVM框架中,實(shí)現(xiàn)的View和Viewmode的雙向數(shù)據(jù)綁定2022-08-08

