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

以上就是本篇文章最終要實現的效果,和省份簡稱鍵盤不同的是,數據源上和邊距有所差別之外,其他的實現方式均是一樣的,采用外部垂直LinearLayout,內部多個橫向的LinearLayout的搭配方式。
需要注意的是,英文和數字鍵盤,默認狀態(tài)下,頂部的數字是禁止的,也就是輸入完地區(qū)代碼之后,數字的禁止狀態(tài)才會釋放;由于距離左右的邊距不同,其在數據源的判斷上也會有不同,這個也是需要注意的。
二、設置屬性,制定可擴展效果
其相關屬性和上篇的省份鍵盤基本上沒有太大的出入,主要就是動態(tài)化設置,設置一些,文字的背景,大小,顏色以及格子之間的編輯等,大概羅列了以下屬性:
| 屬性 | 類型 | 概述 |
|---|---|---|
| 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 | 完成按鈕文字內容 |
| 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 | 數字是否禁止 |
| ek_text_prohibit_color | color | 數字禁止顏色 |
| ek_text_click_effect | boolean | 是否觸發(fā)點擊效果,true點擊后背景消失,false不消失 |
設置回調函數
| 方法 | 概述 |
|---|---|
| keyboardContent | 獲取點擊的省份簡稱簡稱信息 |
| keyboardDelete | 刪除省份簡稱簡稱信息 |
| keyboardComplete | 鍵盤點擊完成 |
| openProhibit | 打開禁止(使領學港澳),使其可以點擊 |
三、部分源碼剖析
這里只貼出部分的關鍵性代碼,整體的代碼,大家滑到底部查看源碼地址即可。
定義字母和數字數組
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"
)定義遍歷數字和字母
由于在數據源上使用的是同一個,那么需要做截取分別進行遍歷,便于控制左右的邊距和本身的格子大小。
//遍歷數字
eachData(mEnglishList.subList(0, 10), mLength, true)
//遍歷字母
eachData(mEnglishList.subList(10, mEnglishList.size), mLength - 1, false)
//追加最后一個刪除按鈕View,動態(tài)計算寬度
addEndView(mLineLayout)遍歷數據
遍歷數據的邏輯和上篇保持一致,當和定義的長度取模為0時,就需要換行,換行就是重新創(chuàng)建一個水平的LinearLayout,添加至垂直的LinearLayout之中,需要做判斷的是,左右的邊距。
/**
* AUTHOR:AbnerMing
* INTRODUCE:遍歷數據
*/
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) {
//是數字
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
//設置文字的屬性
textSize = px2sp(mRectTextSize)
//禁止
if (isNumber) {
//是數字
if (mNumProhibit) {
setTextColor(mRectTextColor)
} else {
setTextColor(mNumProhibitColor)
}
} else {
setTextColor(mRectTextColor)
}
setBackgroundResource(mRectBackGround)
gravity = Gravity.CENTER
setOnClickListener {
//每個格子的點擊事件
if (isNumber && !mNumProhibit) {
//如果是數字,根據規(guī)則暫時不觸發(fā)點擊
return@setOnClickListener
}
changeTextViewState(this)
}
}
//是數字
if (isNumber) {
mTempTextViewList.add(textView)
}
addRectView(textView, mLineLayout, 1f)
}
}添加視圖
設置每個格子的寬高和權重。
/**
* 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)的計算其本身的寬高,基本上和上篇一致,就不過多贅述了。
四、開源地址及使用總結
開源地址:github.com/AbnerMing888/EnglishKeyboardView
關于如何使用,有兩種方式,一種是下載源碼,直接把源碼復制出來,二是可以使用以下的遠程Maven依賴方式。
Maven具體調用
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" />總結
屬性配置了有很多,可以實現多種自定義的相關效果,大家可以查找第二項中的屬性介紹,進行自定義配置,還是那句話,本身的實現方式有很多種,本篇只是其中的一個簡單的案例,僅供大家作為一個參考。
自定義英文和數字鍵盤,大家有沒有發(fā)現了少了一個字母,為什么會沒有這個字母呢?你知道原因嗎?
以上就是Android自定義實現一個車牌字母選擇鍵盤的詳細內容,更多關于Android鍵盤的資料請關注腳本之家其它相關文章!
相關文章
Android Studio中CodeStyle模板的配置方式
這篇文章主要介紹了Android Studio中CodeStyle模板的配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
android 獲取手機GSM/CDMA信號信息,并獲得基站信息的方法
下面小編就為大家?guī)硪黄猘ndroid 獲取手機GSM/CDMA信號信息,并獲得基站信息的方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
Android中PopupWindow彈出式窗口使用方法詳解
這篇文章主要為大家詳細介紹了Android中PopupWindow彈出式窗口的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09
Android實現文字垂直滾動、縱向走馬燈效果的實現方式匯總
本文給大家分享了三種方式實現Android文字垂直滾動、縱向走馬燈效果,文中給大家介紹了相關屬性及注意事項,需要的朋友參考下吧2017-12-12
Android 動態(tài)顯示和隱藏狀態(tài)欄詳解及實例
這篇文章主要介紹了Android 動態(tài)顯示和隱藏狀態(tài)欄的相關資料,需要的朋友可以參考下2017-06-06

