亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Kotlin自定義實現支付密碼數字鍵盤的方法實例

2024-07-21 23:03:47
字體:
來源:轉載
供稿:網友

你能學到什么

  • kotlin的使用, 擴展特性的寫法等
  • 自定義ViewGroup的一些基礎知識
  • xml屬性的編寫和讀取

因為每個按鍵都考慮到需要支持背景設置等其他個性設置和Touch手勢的處理, 所以我決定采用 每個按鍵 對應一個View的思路實現. 否則可以使用Canvas.drawText實現

這樣可以提高擴展性和可自定義性

1.根據效果圖先定義按鍵

//首先定義需要的那些按鍵//順序打亂,展示的時候也就是亂序的,可以更安全.//特殊按鍵-> "":表示空白占位按鍵; "-1":表示回退鍵, 也就是刪除.var keys = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "", "0", "-1")

更新對應的按鍵, 創建對應的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, 保存按鍵對應的值  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.按鍵元素創建好之后, 開始自定義ViewGroup的標準操作

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中的坐標位置

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:事件監聽和回調

 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 文件夾中創建一個任意文件名的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 都是標準寫法, name對應的就是自定義view的類型, 都是標準寫法, 不同的format對應不同的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: 都是必備的寫法, 中間部分才是對應的屬性讀取操作.

源碼地址 https://github.com/angcyo/KeyboardLayout (本地下載)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕在线视频日韩| 精品偷拍一区二区三区在线看| 欧美做爰性生交视频| 久久久久久国产精品三级玉女聊斋| 亚洲激情在线观看| 精品日本高清在线播放| 亚洲人高潮女人毛茸茸| 国产精品永久免费在线| 亚洲网站在线观看| 亚洲护士老师的毛茸茸最新章节| 色综合久久精品亚洲国产| 久久久国产精彩视频美女艺术照福利| 日韩成人中文电影| 亚洲精品国产综合区久久久久久久| 欧美综合一区第一页| 中文字幕欧美日韩va免费视频| 91亚洲精品在线| 97在线视频免费观看| 国产有码在线一区二区视频| 国产亚洲欧美日韩美女| 欧美成人精品三级在线观看| 日韩在线高清视频| 北条麻妃99精品青青久久| 海角国产乱辈乱精品视频| 日韩av三级在线观看| 欧美专区日韩视频| 中文字幕视频在线免费欧美日韩综合在线看| 久久久成人精品| 日韩精品中文在线观看| 日韩亚洲一区二区| 色综合久久天天综线观看| 欧美视频一二三| 色多多国产成人永久免费网站| 久久久91精品国产一区不卡| 国产精品久久久久久久av大片| 国产视频久久久久| 国内外成人免费激情在线视频网站| 久久国产精品99国产精| 成人久久18免费网站图片| 午夜精品一区二区三区在线视频| 欧美国产中文字幕| 欧美激情2020午夜免费观看| 欧美日韩美女视频| 懂色aⅴ精品一区二区三区蜜月| 亚洲欧美综合图区| 伊人伊成久久人综合网小说| 91久久久亚洲精品| 亚洲国产精品高清久久久| 国产精品美女免费| 日韩欧美精品网址| 日韩最新免费不卡| 欧美一级黄色网| 欧美激情久久久久久| 国产午夜精品全部视频在线播放| 久久在线免费观看视频| 亚洲男子天堂网| 在线性视频日韩欧美| 国产91精品黑色丝袜高跟鞋| 91精品国产自产在线观看永久| 亚洲成人激情小说| 国内精品一区二区三区四区| 亚洲综合最新在线| 日韩av电影在线免费播放| 最新69国产成人精品视频免费| 成人字幕网zmw| 亚洲高清不卡av| 日韩电影中文 亚洲精品乱码| 亚洲色图第三页| 在线国产精品播放| 欧美一级视频免费在线观看| 国产成人亚洲综合| 久久国产精品亚洲| 日韩免费在线免费观看| 国产亚洲成精品久久| 国产精品99蜜臀久久不卡二区| 91久久久久久| 国产精品久久久久久久美男| 亚洲国产成人精品电影| 在线播放国产一区二区三区| 国产91精品在线播放| 久久国产一区二区三区| 欧美另类xxx| 18久久久久久| 高清欧美一区二区三区| 日韩中文av在线| 久久亚洲国产精品| 国产精品福利小视频| 日韩美女在线观看| www.日本久久久久com.| 国产日韩精品视频| 亚洲欧美另类自拍| 国产男人精品视频| 色妞久久福利网| 91老司机精品视频| 久久综合伊人77777| 欧美性开放视频| 中文字幕国产亚洲2019| 精品中文字幕久久久久久| 欧美伊久线香蕉线新在线| 日本亚洲欧洲色| 亚洲视频综合网| 欧美人在线视频| 久久久久免费视频| 91精品久久久久久久久中文字幕| 丰满岳妇乱一区二区三区| 91免费福利视频| 欧美成人精品激情在线观看| 日韩在线免费观看视频| 91久久在线观看| 日韩欧美国产高清91| 日韩有码视频在线| 亚洲精品按摩视频| 欧美精品九九久久| 91av免费观看91av精品在线| 国产欧美精品久久久| 日韩av三级在线观看| 久久综合电影一区| 国产精品揄拍500视频| 九色精品免费永久在线| 亚洲已满18点击进入在线看片| 精品久久久久久久久久ntr影视| 久久久久久有精品国产| 欧美激情免费看| 国产玖玖精品视频| 97视频网站入口| 欧美猛交ⅹxxx乱大交视频| 中文字幕精品影院| 在线播放精品一区二区三区| 国产欧美精品va在线观看| 最近更新的2019中文字幕| 亚洲女人天堂视频| 欧美激情视频网| 奇米成人av国产一区二区三区| 成人免费观看49www在线观看| 久久久成人精品视频| 97在线观看视频| 日韩美女福利视频| 97在线视频精品| 亚洲精品久久久久中文字幕欢迎你| 日韩精品免费看| 色噜噜狠狠狠综合曰曰曰| 日韩经典中文字幕| 国产精品网址在线| 福利一区视频在线观看| 另类色图亚洲色图| 欧美性视频精品| 国产亚洲激情视频在线| 精品视频—区二区三区免费| 欧美激情二区三区| 国产精品av网站| 国产专区欧美专区| 国产成人精品免高潮在线观看| 亚洲二区在线播放视频| 国产mv久久久| 性色av一区二区三区| 91精品国产高清自在线看超| 伊人久久大香线蕉av一区二区| 久久影院模特热| 91精品国产一区| 日韩av免费在线看| 亚洲自拍偷拍第一页| 欧美理论电影在线播放| 精品偷拍一区二区三区在线看| 亚洲欧美第一页|