android 自定义键盘长按弹窗

发布时间:2024年01月24日
自己记忆,下次不用找
KeyboardView的onLongPress是长按监听,通过onLongPress可以获取键盘上用户长按的字母

override fun onLongPress(popupKey: Keyboard.Key): Boolean {
    val label = popupKey.label
    if (!TextUtils.isEmpty(label) && popupKey.codes.get(0) != MyKeyCode.CODE_SPACE && popupKey.codes.get(0) != MyKeyCode.KEYCODE_DONE) {
        val str = label.toString()
         
            keyboardPopup = KeyboardPopup(context, popupKey)
            val drawable = context.resources.getDrawable(R.drawable.bg_white_12)
            keyboardPopup?.setBackgroundDrawable(drawable)
            keyboardPopup?.update()
            keyboardPopup?.showAtLocation(this, Gravity.NO_GRAVITY, popupKey.x, popupKey.y)

            invalidateAllKeys()
        
        return true
    }
    return super.onLongPress(popupKey)
}

配合onTouchEvent可以做到弹出弹窗后,选择弹窗内容

override fun onTouchEvent(event: MotionEvent): Boolean {
    when (event.action) {
        MotionEvent.ACTION_MOVE -> {
            val x = event.x.toInt()
            val y = event.y.toInt()
            keyboardPopup?.run {
                if (this.isShowing()) {
                    this.handleTouch(x, y)
                }
            }
            return false
        }
        MotionEvent.ACTION_UP -> {
            keyboardPopup?.run {
                if (this.isShowing()) {
                    val inputMethodService = context as? MyInputMethodService
                    val ic = inputMethodService?.currentInputConnection
                    ic?.commitText(this.selectedLetter, 1)
                    this.dismiss()
                    keyboardPopup = null
                }
            }
        }
    }
    return super.onTouchEvent(event)

}

keyLetters就是你的弹窗展示的候选字的集合,letterTextView就是弹窗内展示选中字的控件

fun handleTouch(x: Int, y: Int) {
    if (keyLetters?.size == 0) {
        return
    }
    if (contentView.width == 0) {
        return
    }


    // 根据手指滑动的位置计算选中的字母
    val letterIndex = (x / (contentView.width / keyLetters!!.size)).coerceIn(0, keyLetters!!.size - 1)

    val letterTextView = contentView.findViewById<TextView>(R.id.letterTextView)
}
文章来源:https://blog.csdn.net/qq_37324563/article/details/135826881
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。