Kotlin自定義實(shí)現(xiàn)支付密碼數(shù)字鍵盤的方法實(shí)例
你能學(xué)到什么
- kotlin的使用, 擴(kuò)展特性的寫法等
- 自定義ViewGroup的一些基礎(chǔ)知識
- xml屬性的編寫和讀取
因?yàn)槊總€按鍵都考慮到需要支持背景設(shè)置等其他個性設(shè)置和Touch手勢的處理, 所以我決定采用 每個按鍵 對應(yīng)一個View的思路實(shí)現(xiàn). 否則可以使用Canvas.drawText實(shí)現(xiàn)
這樣可以提高擴(kuò)展性和可自定義性
1.根據(jù)效果圖先定義按鍵
//首先定義需要的那些按鍵
//順序打亂,展示的時候也就是亂序的,可以更安全.
//特殊按鍵-> "":表示空白占位按鍵; "-1":表示回退鍵, 也就是刪除.
var keys = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "", "0", "-1")
更新對應(yīng)的按鍵, 創(chuàng)建對應(yīng)的view
keys.forEach {
val keyView: View = when (it) {
"-1" -> {
//刪除
imageView(R.drawable.keyboard_del, R.drawable.keyboard_del_press).apply {
background = null
setBackgroundColor(Color.parseColor("#E2E7ED"))
}
}
"" -> {
//占位View
View(context).apply {
setBackgroundColor(Color.parseColor("#E2E7ED"))
}
}
else -> {
createKeyView(it)
}
}
keyView.tag = it //通過tag, 保存按鍵對應(yīng)的值
addView(keyView)
}
private fun createKeyView(key: String): View {
return if (useImageKey) {
val keyRes = when (key) {
"1" -> R.drawable.keyboard_1
"2" -> R.drawable.keyboard_2
"3" -> R.drawable.keyboard_3
"4" -> R.drawable.keyboard_4
"5" -> R.drawable.keyboard_5
"6" -> R.drawable.keyboard_6
"7" -> R.drawable.keyboard_7
"8" -> R.drawable.keyboard_8
"9" -> R.drawable.keyboard_9
else -> R.drawable.keyboard_0
}
imageView(keyRes)
} else {
textView(key)
}
}
private fun imageView(res: Int, pressRes: Int = -1): ImageView {
return ImageView(context).apply {
if (pressRes == -1) {
setImageResource(res)
} else {
setImageResource(res)
//setImageDrawable(ResUtil.selector(getDrawable(res), getDrawable(pressRes)))
}
scaleType = ImageView.ScaleType.CENTER
keyViewBGDrawable?.let {
background = it.constantState.newDrawable()
}
setOnClickListener(this@KeyboardLayout)
}
}
private fun textView(text: String): TextView {
return TextView(context).apply {
gravity = Gravity.CENTER
this.text = text
setTextSize(TypedValue.COMPLEX_UNIT_PX, keyTextSize)
keyViewBGDrawable?.let {
background = it.constantState.newDrawable()
}
setTextColor(Color.BLACK)
setOnClickListener(this@KeyboardLayout)
}
}
2.按鍵元素創(chuàng)建好之后, 開始自定義ViewGroup的標(biāo)準(zhǔn)操作
onMeasure:測量每個按鍵的寬度和高度
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
//super.onMeasure(widthMeasureSpec, heightMeasureSpec)
var widthSize = MeasureSpec.getSize(widthMeasureSpec)
val widthMode = MeasureSpec.getMode(widthMeasureSpec)
var heightSize = MeasureSpec.getSize(heightMeasureSpec)
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
if (widthMode != MeasureSpec.EXACTLY) {
widthSize = resources.displayMetrics.widthPixels
}
if (heightMode != MeasureSpec.EXACTLY) {
heightSize = (4 * keyViewHeight + 3 * vSpace).toInt()
}
childWidth = ((widthSize - 2 * hSpace - paddingLeft - paddingRight) / 3).toInt()
childHeight = ((heightSize - 3 * vSpace - paddingTop - paddingBottom) / 4).toInt()
childs { _, view ->
view.measure(exactlyMeasure(childWidth), exactlyMeasure(childHeight))
}
setMeasuredDimension(widthSize, heightSize)
}
onLayout:決定按鍵在ViewGroup中的坐標(biāo)位置
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
//一行一行布局, 共4行
for (line in 0..3) {
var top: Int = (paddingTop + line * (childHeight + vSpace)).toInt()
//3列
for (i in 0..2) {
var left: Int = (paddingLeft + i * (childWidth + hSpace)).toInt()
getChildAt(line * 3 + i).layout(left, top, left + childWidth, top + childHeight)
}
}
}
3:事件監(jiān)聽和回調(diào)
override fun onClick(v: View?) {
if (onKeyboardInputListener == null) {
return
}
v?.let { view ->
val tag = view.tag
if (tag is String) {
val isDel = "-1" == tag
onKeyboardInputListener?.onKeyboardInput(tag, isDel)
}
}
}
4:xml中的屬性聲明
需要在 values 文件夾中創(chuàng)建一個任意文件名的xml文件
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="KeyboardLayout"> <attr name="r_key_height" format="dimension"/> <attr name="r_key_width" format="dimension"/> <attr name="r_key_text_size" format="dimension"/> <attr name="r_key_background" format="reference"/> <attr name="r_background" format="reference"/> <attr name="r_use_image_key" format="boolean"/> </declare-styleable> </resources>
declare-styleable 都是標(biāo)準(zhǔn)寫法, name對應(yīng)的就是自定義view的類型, 都是標(biāo)準(zhǔn)寫法, 不同的format對應(yīng)不同的get方法. 熟悉了就很容易使用.
5:xml中的屬性讀取
init {
val typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.KeyboardLayout) //注意1:
keyViewHeight = typedArray.getDimensionPixelOffset(R.styleable.KeyboardLayout_r_key_height, keyViewHeight)
//typedArray.getDimensionPixelOffset(R.styleable.KeyboardLayout_r_key_width, keyViewHeight)
keyTextSize = typedArray.getDimension(R.styleable.KeyboardLayout_r_key_text_size, keyTextSize)
useImageKey = typedArray.getBoolean(R.styleable.KeyboardLayout_r_use_image_key, useImageKey)
keyViewBGDrawable = typedArray.getDrawable(R.styleable.KeyboardLayout_r_key_background)
if (keyViewBGDrawable == null) {
keyViewBGDrawable = getDrawable(R.drawable.base_white_bg_selector)
}
mBackgroundDrawable = typedArray.getDrawable(R.styleable.KeyboardLayout_r_background)
if (mBackgroundDrawable == null) {
mBackgroundDrawable = ColorDrawable(getColor(R.color.base_chat_bg_color))
}
setWillNotDraw(false)
typedArray.recycle() //注意2
}
注意1,2: 都是必備的寫法, 中間部分才是對應(yīng)的屬性讀取操作.
源碼地址 https://github.com/angcyo/KeyboardLayout (本地下載)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Flutter Reusable Lottie Animations技巧
這篇文章主要為大家介紹了Flutter Reusable Lottie Animations技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android AIDL和遠(yuǎn)程Service調(diào)用示例代碼
本文主要介紹Android AIDL和遠(yuǎn)程Service,這里詳細(xì)介紹了相關(guān)知識,并附實(shí)例代碼和實(shí)現(xiàn)效果圖,有興趣的朋友參考下2016-08-08
Android中在WebView里實(shí)現(xiàn)Javascript調(diào)用Java類的方法
這篇文章主要介紹了Android中在WebView里實(shí)現(xiàn)Javascript調(diào)用Java類的方法,本文直接給出示例,需要的朋友可以參考下2015-03-03
Android 將文件下載到指定目錄的實(shí)現(xiàn)代碼
本文通過實(shí)例代碼給大家介紹了android將文件下載到指定目錄的實(shí)現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-06-06
Kotlin中的Checked Exception機(jī)制淺析
這篇文章主要給大家介紹了關(guān)于Kotlin中Checked Exception機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Android自定義View軟鍵盤實(shí)現(xiàn)搜索
本文給大家分享android自定義view軟鍵盤實(shí)現(xiàn)搜索,對android軟鍵盤相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2015-12-12

