国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > 綜合 > 正文

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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
jizz在线视频| 国产中文字幕在线看| 中文字幕中文字幕在线中高清免费版| 在线观看免费高清完整| 国产精品人人爱一区二区白浆| 国产丝袜视频在线播放| 国产国语**毛片高清视频| 中文字幕2020第一页| av亚洲男人天堂| 黄色毛片在线看| 中文字幕第一页av| 精品176二区| 激情丁香婷婷| 91免费日韩| ·天天天天操| 好看的中文字幕在线播放| 国产日本视频| 毛片在线视频| 97国产在线| 久久精品视频免费看| 国产亚洲精品午夜高清影院| 精品一区二区三区在线成人 | 中文字幕不卡| 99在线视频观看| 中文字幕在线影院| 欧美精品se| 国产三级视频在线看| 免费99热在线观看| 亚洲综合在线网| 制服丝袜中文字幕在线观看| 国产丝袜视频在线播放| 国产一卡2卡3卡4卡网站免费| 女子免费在线观看视频www| 亚洲www色| 亚洲字幕成人中文在线观看| 国产福利资源| 国产特级淫片免费看| 尤物在线网址| 国产九色porn网址| 欧美啪啪精品| 激情小说 在线视频| 午夜在线观看91| 亚洲精品一线| www.99av| 欧美成人精品福利网站| 免费不卡中文字幕视频| 欧美高清视频| 高清在线观看av| 综合图区亚洲白拍在线| 中中文字幕av在线| 国产精品国产国产aⅴ| 国产成+人+亚洲+欧美+综合| 2018狠狠干| 亚洲精品手机在线| 欧美视频免费一区二区三区| 国产原创精品视频| 国产在线观看色| 国产性色视频| 99热99re6国产在线播放| 四虎www视频| 国产中文在线视频| 国产精品国产国产aⅴ| 在线免费观看黄色av| free性亚洲| 99视频资源网| 亚洲综合在线不卡| 国产男女猛烈无遮挡免费视频 | 欧美专区日韩| 91xxx在线观看| 在线激情小视频| 久热国产在线视频| 国产高清一区二区三区视频| 女人色在线免费视频| 国产福利免费在线观看| 日本三级在线视频| 国产精品99爱免费视频| 男女午夜视频在线观看| 精品一区二区三区在线成人| 久蕉依人在线视频| 色综合久久五月天| 国产精品久久在线| 粉嫩av一区| 亚洲视频精品在线观看| 国产一二区视频| 开心丁香婷婷深爱五月| 国产精品伦一区二区三区视频| www在线视频观看| 精品国内自产拍在线视频| 中文字幕在线免费视频| 可以免费看污视频的网站| 永久免费av网站| 亚洲国产aⅴ精品| 亚洲午夜久久久久中文字幕| 91欧美在线视频| 91在线最新| ·天天天天操| 91九色在线看| 精品一区二区在线欧美| 国产高清大尺度一区二区不卡| 国产精品一二三区视频| www.操操操.com| 免费电影网站在线视频观看福利| 亚洲wwwwww| 波多野结衣中文字幕久久| 日韩中文字幕久久久经典网| 午夜影院免费看| 开心婷婷激情| 成人精品一区二区三区免费| 最新国产在线| 91中文字幕| gogo高清在线播放免费| 欧美啪啪精品| 国产免费视频在线| √天堂资源地址在线官网| 国产精品久久久久久精| 国产精品777一区二区| 国产白浆在线| www亚洲天堂| 成人午夜无人区一区二区| 国产一二三区在线观看| 国产福利小视频在线观看| 永久免费网站在线| 九色视频网站| 在线视频婷婷| 午夜国产视频| 日本三级在线视频| 中文字幕日本在线| 伊人影院在线播放| 国产免费a∨片在线观看不卡| 国产国产人免费人成免费视频| 国产高清在线观看| 黄色av网站在线| 国产99re| 国产一区二区三区福利| 午夜在线观看91| 国产精品免费视频二三区| av在线官网| 国产精品乱码一区二区三区视频| 日日夜夜中文字幕| 精品美女在线观看视频在线观看| 六月天色婷婷| gogo高清在线播放免费| 99在线播放| 国产成人精品男人的天堂538| 激情在线视频播放| 在线中文av| 国产高清视频免费最新在线| 福利在线观看| 国产剧情在线一区| 欧美日韩性视频一区二区三区| 2019年中文字幕| 91福利在线视频| 国产精品久久久久久福利| 国产主播福利在线| 九九热在线观看| 人人在线视频| 久久一本精品| 九九在线免费视频| 狠狠干五月天| 天天av天天爽| 国产理论片免费观看| 丁香婷婷在线观看| √天堂中文在线| 国产精品剧情一区二区在线观看| 国产麻豆精品视频一区二区| 狠狠干天天干| 中文字幕中文字幕在线中高清免费版| 国产中文字幕在线| 最近久乱中文字幕| 国产精品爱久久久久久久小说| 国产精品ⅴa有声小说| 国产精品毛片一区二区三区四区 | 午夜在线视频播放| 午夜小视频在线| 国产永久免费高清在线观看视频 | 日本在线视频www鲁啊鲁| yjizz视频网站在线播放| 欧美性xxxx交| 中文字幕乱在线伦视频乱在线伦视频 | 国产一级黄色大片| 国产网友自拍电影在线| 国产成免费视频| av在线你懂的| 天天av天天爽| 一级二级在线观看| 午夜视频在线观看网站午夜视频在线 | 欧美国产中文| 国产写真视频在线观看| 精品99又大又爽又硬少妇毛片| 香蕉视频在线观看网站| 久久亚洲天堂| 99热在线观看免费| av丝袜在线| 国产精品久久久久久福利| 欧美卡一卡二| 国产夫妻视频| 欧美卡一卡二| 亚洲成人在线播放| 国产人成网在线播放va免费| av资源网站在线观看|