溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android開發(fā)之自定義數(shù)字鍵盤的示例

發(fā)布時(shí)間:2021-02-19 10:18:39 來源:億速云 閱讀:457 作者:小新 欄目:移動開發(fā)

這篇文章給大家分享的是有關(guān)Android開發(fā)之自定義數(shù)字鍵盤的示例的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

Android開發(fā)之自定義數(shù)字鍵盤的示例

效果圖

加載鍵盤存儲鍵屬性的XML描述

我們下面的介紹都是依靠上圖的實(shí)現(xiàn)來展開的,首先是軟鍵盤的布局,我們需要我們的res/xml目錄下創(chuàng)建一個(gè)xml文件,根節(jié)點(diǎn)就是Keyboard,然后就是鍵盤的每一行Row,每一行中可以指定每一列,也就是具體的鍵Key,代碼實(shí)現(xiàn)

<?xml version="1.0" encoding="utf-8"?><!--
isRepeatable:長按時(shí)是否重復(fù)這個(gè)操作
-->
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
 android:horizontalGap="1px"
 android:keyHeight="7%p"
 android:keyWidth="33.33%p"
 android:verticalGap="1px">
 <Row android:keyHeight="6%p">
 <Key
 android:codes="-4"
 android:keyIcon="@drawable/hidden"
 android:keyWidth="100%" />
 </Row>
 <Row>
 <Key
 android:codes="49"
 android:keyLabel="1" />
 <Key
 android:codes="50"
 android:keyLabel="2" />
 <Key
 android:codes="51"
 android:keyLabel="3" />
 </Row>
 <Row>
 <Key
 android:codes="52"
 android:keyLabel="4" />
 <Key
 android:codes="53"
 android:keyLabel="5" />
 <Key
 android:codes="54"
 android:keyLabel="6" />
 </Row>
 <Row>
 <Key
 android:codes="55"
 android:keyLabel="7" />
 <Key
 android:codes="56"
 android:keyLabel="8" />
 <Key
 android:codes="57"
 android:keyLabel="9" />
 </Row>
 <Row>
 <Key
 android:codes="46"
 android:keyLabel="." />
 <Key
 android:codes="48"
 android:keyLabel="0" />
 <Key
 android:codes="-5"
 android:isRepeatable="true"
 android:keyIcon="@drawable/delete" />
 </Row>
</Keyboard>

在Keyboard節(jié)點(diǎn)屬性中,我們通過horizontalGap設(shè)置水平的間距,通過verticalGap設(shè)置垂直的間距,通過keyWidth設(shè)置每一個(gè)key的寬度,通過keyHeight設(shè)置。需要注意的地點(diǎn)是如果Keyboard ,Row和Key都可以指定寬高。通常我們可以指定在Keyboard 中設(shè)置每一個(gè)鍵的寬高就可以了。當(dāng)然如果對特定行的寬高要有所調(diào)整,可以在Row 或者key上設(shè)置,例如我們示例圖中展示的最上面的一行,它的寬度比其它行都低了一點(diǎn),則我們在第一行設(shè)置了屬性android:keyHeight="6%p"

在每一個(gè)key中有下面常用屬性

1、android:codes 官網(wǎng)介紹是說這個(gè)是該鍵的unicode 值或者逗號分隔值,當(dāng)然我們也可以設(shè)置成我們想要的值,在源碼中提供了幾個(gè)特定的值

//就不解釋了,通過名字應(yīng)該看得出來
 public static final int KEYCODE_SHIFT = -1;
 public static final int KEYCODE_MODE_CHANGE = -2;
 public static final int KEYCODE_CANCEL = -3;
 public static final int KEYCODE_DONE = -4;
 public static final int KEYCODE_DELETE = -5;
 public static final int KEYCODE_ALT = -6;

2、android:keyOutputText 設(shè)置該值后,當(dāng)點(diǎn)擊key時(shí)回調(diào)onText(text: CharSequence?)會執(zhí)行,參數(shù)就是我們設(shè)置的值。

3、android:keyIcon設(shè)置key上顯示的icon

4、android:keyLabel 鍵上顯示的值

5、android:isRepeatable 當(dāng)長按時(shí)是否重復(fù)該鍵設(shè)置的操作,例如我們刪除鍵可以設(shè)置此屬性。

6、android:keyEdgeFlags 該屬性有兩個(gè)值,分別是left,right,用與指定顯示在最左還是最右,一般不用此屬性。默認(rèn)從左到右排列。

還有其它屬性,不在介紹,可以自己去查閱api

自定義KeyboardView

該類是用來渲染虛擬鍵盤的類,類中有一個(gè)接口OnKeyboardActionListener能檢測按鍵和觸摸動作,我們要自定義虛擬鍵盤,只需要繼承該類并實(shí)現(xiàn)該監(jiān)聽接口即可,當(dāng)然我這里并沒有實(shí)現(xiàn)接口,我單獨(dú)創(chuàng)建了一個(gè)工具類,用于將自定義鍵盤View和EditText關(guān)聯(lián),并設(shè)置接口監(jiān)聽,這些稍后介紹到再說,我們最主要關(guān)注的就是onDraw方法,它可以讓我們自定義鍵盤的繪制,隨心所欲的畫我們想要的東西。當(dāng)然,我們也可以不做任何實(shí)現(xiàn),它默認(rèn)的有一種繪制。

class CustomKeyboardView : KeyboardView {
 private var mKeyBoard: Keyboard? = null

 constructor(context: Context, attrs: AttributeSet) : this(context, attrs,0) {}

 constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
 //
 }

 override fun onDraw(canvas: Canvas) {
 super.onDraw(canvas)
 mKeyBoard = this.keyboard
 var keys: MutableList<Keyboard.Key>? = null
 if (mKeyBoard != null) {
 keys = mKeyBoard!!.keys
 }
 if (keys != null) {
 for (key in keys) {
 //可以自定義自己的繪制(例如某個(gè)按鈕繪制背景圖片和文字,亦或者更改某個(gè)按鈕顏色等)
 if (key.codes[0] == -111) {//過濾指定某個(gè)鍵自定義繪制
 }
 }
 }
 }
}

在上面的onDraw方法中,我們通過this.keyboard(即java的getKeyboard方法,是KeyboardView 中的方法)獲取Keyboard對象,并通過mKeyBoard!!.keys獲取鍵盤的Key對象,即每一個(gè)鍵對象,如果我們想自定義繪制,就可以自己實(shí)現(xiàn)繪制,當(dāng)然也可以針對個(gè)人鍵繪制,例如鍵上字體顏色,背景等。例如我們針對Key的code是 -111的自定義一些繪制操作。

 if (key.codes[0] == -111) {//過濾指定某個(gè)鍵自定義繪制
  //繪制后,原來xml中的keyLabel以及keyIcon會被覆蓋,如需顯示文字
  //需要自己重新繪制,要后繪制文字,否則文字不顯示
  drawBackground(R.drawable.bg_keyboardview1, canvas, key)
  drawTextOrIcon(canvas, key)
 }

背景selector

<selector
 xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@color/btnpressed" android:state_pressed="true"/>
 <item android:drawable="@color/btnnormal"/>
</selector>

需要注意的是需要先繪制背景,再繪制文字或icon,否則文字或者icon就看不到了,相信你肯定知道為啥,真不知道的話那....

 //繪制背景
 fun drawBackground(drawableId: Int, canvas: Canvas, key: Keyboard.Key) {
 var drawable = resources.getDrawable(drawableId)
 var drawableState: IntArray = key.currentDrawableState
 if (key.codes[0] != 0) {
  drawable.state=drawableState
 }
 drawable.bounds = Rect(key.x, key.y, key.x + key.width, key.height + key.y)
 drawable.draw(canvas)
 }

繪制背景前先通過key.currentDrawableState(java的getCurrentDrawableState() 方法,后面不在提了)獲取當(dāng)前的狀態(tài),然后設(shè)置到drawable,然后通過Rect指定繪制的區(qū)域。Rect參數(shù)分別是左上右下。key.x,key.對應(yīng)的就是該key的左上角的坐標(biāo),則left=key.x, top=key.y, right=key.x+key.width, bottom=key.y+key.height然后調(diào)用 drawable.draw(canvas)開始繪制。

繪制完成背景之后,我們開始繪制文字或者icon。

 //繪制文字或圖標(biāo)
 fun drawTextOrIcon(canvas: Canvas, key: Keyboard.Key) {
 var bounds = Rect()
 var paint = Paint()
 paint.color = Color.WHITE
 paint.isAntiAlias = true
 paint.textAlign = Paint.Align.CENTER
 paint.typeface = Typeface.DEFAULT
 if (key.label != null) {
  var label = key.label.toString()
  //為了將字體大小與默認(rèn)繪制的Label字體大小相同,需要反射獲取默認(rèn)大小。然后在此處設(shè)置文字大小
  //還有一種取巧的方法在布局文件keyboardview中設(shè)置keyTextSize,labelTextSize
  var field = KeyboardView::class.java.getDeclaredField("mLabelTextSize")
  field.isAccessible = true
  var labelTextSize = field.get(this) as Int
  paint.textSize = labelTextSize.toFloat()
  paint.getTextBounds(label, 0, label.length, bounds)
  canvas.drawText(label, (key.x + key.width / 2).toFloat(), (key.y + key.height / 2 + bounds.height() / 2).toFloat(), paint)
 } else if (key.icon != null) {
  key.icon.bounds = Rect(key.x + (key.width - key.icon.intrinsicWidth) / 2, key.y + (key.height - key.icon.intrinsicHeight) / 2, key.x + (key.width - key.icon.intrinsicWidth) / 2 + key.icon.intrinsicWidth, key.y + (key.height - key.icon.intrinsicHeight) / 2 + key.icon.intrinsicHeight)
  key.icon.draw(canvas)
 }
 }

通過上面的代碼,我們做了下判斷如果有l(wèi)abel的時(shí)候就繪制文字,如果沒有但是有icon就繪制icon,否則不做處理。在這里可以指定繪制文字的大小,顏色等。需要注意的一點(diǎn)是文字大小,為了和顯示的其他默認(rèn)繪制key的大小相同,需要獲取KeyboardView中的mLabelTextSize或者mKeyTextSize,因?yàn)樵撟兞繘]有提供暴露方法,所以需要我們反射操作。當(dāng)然還有一種取巧的方法,我們可以在xml中指定字體大小,在此設(shè)置成相同大小。對于坐標(biāo)區(qū)域的計(jì)算上面已經(jīng)做了分析。

布局使用

<?xml version="1.0" encoding="utf-8"?><!--
background:整個(gè)鍵盤的背景色
keyBackground :設(shè)置鍵的背景
keyPreviewHeight:預(yù)覽高度
keyPreviewLayout :設(shè)置預(yù)覽布局
keyPreviewOffset :設(shè)置反饋的垂直偏移量
keyTextColor :設(shè)置key標(biāo)簽文字顏色
keyTextSize:設(shè)置key標(biāo)簽字體大小
labelTextSize:設(shè)置帶文本和圖標(biāo)的鍵上個(gè)的文本的小大

-->
<com.code4android.keyboard.CustomKeyboardView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/keyboard_view"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@color/keyborad_line_color"
 android:focusable="true"
 android:focusableInTouchMode="true"
 android:keyBackground="@drawable/bg_keyboardview"
 android:keyPreviewHeight="35dp"
 android:keyPreviewLayout="@layout/keyboard_key_preview"
 android:keyPreviewOffset="0dp"
 android:keyTextColor="#8a8a8a"
 android:keyTextSize="18sp"
 android:labelTextSize="18sp"
 android:paddingTop="0dp"
 android:shadowColor="#fff"
 android:shadowRadius="0.0" />

我們創(chuàng)建了自定義的View之后,需要再創(chuàng)建上面layout供加載。keyBackground屬性是設(shè)置Key的背景,一般我們可以設(shè)置一個(gè)selected選擇器。keyPreviewHeight設(shè)置預(yù)覽的高度,即我們點(diǎn)擊時(shí)會有一個(gè)提示效果。keyPreviewLayout是我們預(yù)覽的布局,它需要是一個(gè)TextView 。keyPreviewOffset是預(yù)覽的偏移量,keyTextColor設(shè)置key字體顏色,shadowRadius我們一般設(shè)置為0,它表示字體的陰影,如果不設(shè)置0.看起來回模糊。

創(chuàng)建工具類

在工具類中創(chuàng)建了兩個(gè)構(gòu)造方法

 constructor(activity: Activity) : this(activity, true, false)
 /**
 * @param activity
 * @param isRandom 是否時(shí)隨機(jī)鍵盤
 * @param mIsDecimal 是否支持小數(shù)輸入
 */
 constructor(activity: Activity, isRandom: Boolean, isDecimal: Boolean) {
 mActivity = activity
 mIsRandom = isRandom
 mIsDecimal = isDecimal
 mKeyboard = Keyboard(mActivity, R.xml.keyboard)
 addViewToRoot()
 }

//加載自定義的鍵盤layout
 private fun addViewToRoot() {
 mKeyBoardViewContainer = mActivity.layoutInflater.inflate(R.layout.keyboardview, null)
 //var frameLayout: FrameLayout = mActivity.window.decorView as FrameLayout//不要直接往DecorView(狀態(tài)欄,內(nèi)容,導(dǎo)航欄)中addView,如使用這個(gè)則最后顯示布局不全(一部分內(nèi)容在導(dǎo)航欄區(qū)域)
 var frameLayout: FrameLayout = mActivity.window.decorView.find(android.R.id.content)
 var lp = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT)
 lp.gravity = Gravity.BOTTOM
 frameLayout.addView(mKeyBoardViewContainer, lp)
 mKeyBoardView = mKeyBoardViewContainer.find(R.id.keyboard_view)
 }

在構(gòu)造方法中初始化Keyboard,以及布局文件,在代碼中我們看到我們獲取到DecorView中id為android.R.id.content的布局,該布局是FrameLayout 布局,我們創(chuàng)建的布局都是放在這個(gè)布局中了,對這方面不理解的可以看看我之前寫的文章深入分析setContentView。為了讓我們自定義的鍵盤顯示在最下面,設(shè)置Gravity為BOTTOM,然后通過frameLayout.addView(mKeyBoardViewContainer, lp)添加到FrameLayout 中。

除此之外,我們創(chuàng)建一個(gè)函數(shù)attachTo(EditText)將EditText與我們自定義的鍵盤綁定

fun attachTo(editText: EditText) {
 //如果editText與上次設(shè)置的是同一個(gè)對象,并且鍵盤已經(jīng)正在在顯示,不再執(zhí)行后續(xù)操作
 if (mEditText != null && mEditText == editText && mKeyBoardView.visibility == View.VISIBLE) return
 mEditText = editText
 Log.e(TAG, "attachTo")
 //根據(jù)焦點(diǎn)及點(diǎn)擊監(jiān)聽,來顯示或者隱藏鍵盤
 onFoucsChange()
 //隱藏系統(tǒng)鍵盤
 hideSystemSoftKeyboard()
 //顯示自定義鍵盤
 showSoftKeyboard()
 }

 private fun onFoucsChange() {
 mEditText!!.setOnFocusChangeListener { v, hasFocus ->
  Log.e(TAG, "onFoucsChange:$hasFocus" + v)
  //如果獲取焦點(diǎn),并且當(dāng)前鍵盤沒有顯示,則顯示,并執(zhí)行動畫
  if (hasFocus && mKeyBoardView.visibility != View.VISIBLE) {
  mKeyBoardView.visibility = View.VISIBLE
  startAnimation(true)
  } else if (!hasFocus && mKeyBoardView.visibility == View.VISIBLE) {
  //如果當(dāng)前時(shí)失去較大,并且當(dāng)前在鍵盤正在顯示,則隱藏
  mKeyBoardView.visibility = View.GONE
  startAnimation(false)
  }
 }

 mEditText!!.setOnClickListener {
  Log.e(TAG, "setOnClickListener")
  //根據(jù)上面焦點(diǎn)的判斷,如果已經(jīng)獲取到焦點(diǎn),并且鍵盤隱藏。再次點(diǎn)擊時(shí),
  // 焦點(diǎn)改變函數(shù)不會回調(diào),所以在此判斷如果隱藏就顯示
  if (mKeyBoardView.visibility == View.GONE) {
  mKeyBoardView.visibility = View.VISIBLE
  startAnimation(true)
  }
 }
 }

 private fun hideSystemSoftKeyboard() {
 //11版本開始需要反射setShowSoftInputOnFocus方法設(shè)置false,來隱藏系統(tǒng)軟鍵盤
 if (Build.VERSION.SDK_INT > 10) {
  var clazz = EditText::class.java
  var setShowSoftInputOnFocus: Method? = null
  setShowSoftInputOnFocus = clazz.getMethod("setShowSoftInputOnFocus", Boolean::class.java)
  setShowSoftInputOnFocus.isAccessible = true
  setShowSoftInputOnFocus.invoke(mEditText, false)
 } else {
  mEditText!!.inputType = InputType.TYPE_NULL
 }
 var inputMethodManager = mActivity.applicationContext.inputMethodManager
 inputMethodManager.hideSoftInputFromWindow(mEditText!!.windowToken, 0)
 }

private fun showSoftKeyboard() {
 if (mIsRandom) {
  //生成隨機(jī)鍵盤
  generateRandomKey()
 } else {
  //有序鍵盤
  mKeyBoardView.keyboard = mKeyboard
 }
 mKeyBoardView.isEnabled = true
 //設(shè)置預(yù)覽,如果設(shè)置false,則就不現(xiàn)實(shí)預(yù)覽效果
 mKeyBoardView.isPreviewEnabled = true
 //設(shè)置可見
 mKeyBoardView.visibility = View.VISIBLE
 //指定鍵盤彈出動畫
 startAnimation(true)
 //設(shè)置監(jiān)聽
 mKeyBoardView.setOnKeyboardActionListener(mOnKeyboardActionListener())
 }

 private fun generateRandomKey() {
 var keys = mKeyboard.keys
 var numberKeys = mutableListOf<Keyboard.Key>()
 //保存數(shù)字
 var nums = mutableListOf<Int>()
 //0的ASCII碼是48,之后順序加1
 for (key in keys) {
  //過濾數(shù)字鍵盤
  if (key.label != null && "0123456789".contains(key.label)) {
  nums.add(Integer.parseInt(key.label.toString()))
  numberKeys.add(key)
  }
 }
 var random = Random()
 var changeKey = 0//更改numberKeys對應(yīng)的數(shù)值
 while (nums.size > 0) {
  var size = nums.size
  var randomNum = nums[random.nextInt(size)]
  var key = numberKeys[changeKey++]
  key.codes[0] = 48 + randomNum
  key.label = randomNum.toString()
  nums.remove(randomNum)
 }
 mKeyBoardView.keyboard = mKeyboard
 }

具體的解釋已在代碼中體現(xiàn)。

設(shè)置鍵盤監(jiān)聽

在上面代碼中我們看一句mKeyBoardView.setOnKeyboardActionListener(mOnKeyboardActionListener()) ,它就是設(shè)置鍵盤的監(jiān)聽。OnKeyboardActionListener接口是KeyboardView的內(nèi)部類,我們在此設(shè)置監(jiān)聽可以指定在對應(yīng)的回調(diào)種操作EditText。該接口回調(diào)方法如下

1、swipeUp()

當(dāng)用戶快速將手指從下向上移動時(shí)調(diào)用

2、swipeDown 方法

當(dāng)用戶快速將手指從上向下移動時(shí)調(diào)用

3、swipeLeft

當(dāng)用戶快速將手指從右向左移動時(shí)調(diào)用

4、swipeRight()

當(dāng)用戶快速將手指從左向右移動時(shí)調(diào)用

5、onPress(primaryCode: Int)

點(diǎn)擊key時(shí)調(diào)用primaryCode時(shí)對應(yīng)key的codes值

6、onRelease(primaryCode: Int)

釋放key時(shí)調(diào)用

7、onKey(primaryCode: Int, keyCodes: IntArray?)

我選擇在此對EditText的編輯,onPress之后調(diào)用的。

8、onText(text: CharSequence?)

設(shè)置keyOutputText時(shí)會會回調(diào)

具體實(shí)現(xiàn)

 inner class mOnKeyboardActionListener : KeyboardView.OnKeyboardActionListener {
 override fun swipeRight() {
  Log.e(TAG, "swipeRight")
 }

 override fun onPress(primaryCode: Int) {
  Log.e(TAG, "onPress")
  //添加震動效果
  mActivity.applicationContext.vibrator.vibrate(50)
  ////指定隱藏(確定)刪除不顯示預(yù)覽
  mKeyBoardView.isPreviewEnabled = !(primaryCode == Keyboard.KEYCODE_DONE || primaryCode == Keyboard.KEYCODE_DELETE)
 }

 override fun onRelease(primaryCode: Int) {
  Log.e(TAG, "onRelease")
 }

 override fun swipeLeft() {
  Log.e(TAG, "swipeLeft")
 }

 override fun swipeUp() {
  Log.e(TAG, "swipeUp")
 }

 override fun swipeDown() {
  Log.e(TAG, "swipeDown")
 }

 override fun onKey(primaryCode: Int, keyCodes: IntArray?) {
  Log.e(TAG, "onKey primaryCode:$primaryCode keyCodes:$keyCodes")
  if (mEditText == null) throw RuntimeException("The mEditText is null,Please call attachTo method")

  mEditText?.let {
  var editable: Editable = it.text
  var textString = editable.toString()
  //獲取光標(biāo)位置
  var start = it.selectionStart
  when (primaryCode) {
   //如果是刪除鍵,editable有值并且光標(biāo)大于0(即光標(biāo)之前有內(nèi)容),則刪除
   Keyboard.KEYCODE_DELETE -> {
   if (!editable.isNullOrEmpty()) {
    if (start > 0) {
    editable.delete(start - 1, start)
    } else {
    }
   } else {
   }
   }
   Keyboard.KEYCODE_DONE -> {
   hideSoftKeyboard()
   mOnOkClick?.let {
    //點(diǎn)擊確定時(shí),寫一個(gè)回調(diào),如果你對有確定的需求
    it.onOkClick()
   }
   }
   else -> {
   // 由于promaryCode是用的ASCII碼,則直接轉(zhuǎn)換字符即可,46是小數(shù)點(diǎn)
   if (primaryCode != 46 ) {
    //如果點(diǎn)擊的是數(shù)字,不是小數(shù)點(diǎn),則直接寫入EditText,由于我codes使用的是ASCII碼,
    // 則可以直接轉(zhuǎn)換為數(shù)字。當(dāng)然可以你也可以獲取label,或者根據(jù)你自己隨便約定。
    editable.insert(start, Character.toString(primaryCode.toChar()))
   } else {
    //如果點(diǎn)擊的是逗號
    if (mIsDecimal && primaryCode == 46) {
    if ("" == textString) {
     //如果點(diǎn)的是小數(shù)點(diǎn),并且當(dāng)前無內(nèi)容,自動加0
     editable.insert(start, "0.")
    } else if (!textString.contains(".")) {
     //當(dāng)前內(nèi)容不含有小數(shù)點(diǎn),并且光標(biāo)在第一個(gè)位置,依然加0操作
     if (start == 0) {
     editable.insert(start, "0.")
     } else {
     editable.insert(start, ".")
     }
    } else {
     //如果是不允許小數(shù)輸入,或者允許小數(shù),但是已經(jīng)有小數(shù)點(diǎn),則不操作
    }
    } else {
    }
   }
   }
  }
  }
 }

 override fun onText(text: CharSequence?) {
  Log.e(TAG, "onText:" + text.toString())
 }

 }
 fun hideSoftKeyboard(): Boolean {
 if (mEditText == null) return false
 var visibility = mKeyBoardView.visibility
 if (visibility == View.VISIBLE) {
  startAnimation(false)
  mKeyBoardView.visibility = View.GONE
  return true
 }
 return false
 }

 fun startAnimation(isIn: Boolean) {
 Log.e(TAG, "startAnimation")
 var anim: Animation
 if (isIn) {
  anim = AnimationUtils.loadAnimation(mActivity, R.anim.anim_bottom_in)
 } else {
  anim = AnimationUtils.loadAnimation(mActivity, R.anim.anim_bottom_out)
 }
 mKeyBoardViewContainer.startAnimation(anim)
 }

當(dāng)點(diǎn)擊的是KEYCODE_DONE 時(shí),調(diào)用hideSoftKeyboard函數(shù)隱藏鍵盤,并執(zhí)行隱藏動畫,動畫的xml文件就不在貼出了。

具體使用方式如下

 keyboardUtli = KeyBoardUtil(this@KeyBoardDemoActivity)
 et_keyboard.setOnTouchListener { v, event ->
  keyboardUtli?.attachTo(et_keyboard)
  //設(shè)置是否可以輸入小數(shù)
  keyboardUtli?.mIsDecimal = true
  false
 }
 et_keyboard2.setOnTouchListener { v, event ->
  keyboardUtli?.attachTo(et_keyboard2)
  keyboardUtli?.mIsDecimal = false
  false
 }

感謝各位的閱讀!關(guān)于“Android開發(fā)之自定義數(shù)字鍵盤的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI