highlight the currently selected character after long pressing a key
This commit is contained in:
parent
916a64774c
commit
e999e4900b
|
@ -322,11 +322,6 @@ class MyKeyboard {
|
||||||
edgeFlags = parent.rowEdgeFlags
|
edgeFlags = parent.rowEdgeFlags
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Informs the key that it has been pressed, in case it needs to change its appearance or state. */
|
|
||||||
fun onPressed() {
|
|
||||||
pressed = !pressed
|
|
||||||
}
|
|
||||||
|
|
||||||
fun parseCSV(value: String): ArrayList<Int> {
|
fun parseCSV(value: String): ArrayList<Int> {
|
||||||
var count = 0
|
var count = 0
|
||||||
var lastIndex = 0
|
var lastIndex = 0
|
||||||
|
|
|
@ -127,6 +127,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||||
private var mMiniKeyboardOffsetY = 0
|
private var mMiniKeyboardOffsetY = 0
|
||||||
private val mMiniKeyboardCache: MutableMap<MyKeyboard.Key, View?>
|
private val mMiniKeyboardCache: MutableMap<MyKeyboard.Key, View?>
|
||||||
private var mKeys = ArrayList<MyKeyboard.Key>()
|
private var mKeys = ArrayList<MyKeyboard.Key>()
|
||||||
|
private var mMiniKeyboardSelectedKeyIndex = -1
|
||||||
/**
|
/**
|
||||||
* Returns the [OnKeyboardActionListener] object.
|
* Returns the [OnKeyboardActionListener] object.
|
||||||
* @return the listener attached to this keyboard
|
* @return the listener attached to this keyboard
|
||||||
|
@ -569,6 +570,12 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||||
keyBackground.setBounds(0, 0, key.width, key.height)
|
keyBackground.setBounds(0, 0, key.width, key.height)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keyBackground.state = if (key.pressed) {
|
||||||
|
intArrayOf(android.R.attr.state_pressed)
|
||||||
|
} else {
|
||||||
|
intArrayOf()
|
||||||
|
}
|
||||||
|
|
||||||
canvas.translate((key.x + kbdPaddingLeft).toFloat(), (key.y + kbdPaddingTop).toFloat())
|
canvas.translate((key.x + kbdPaddingLeft).toFloat(), (key.y + kbdPaddingTop).toFloat())
|
||||||
keyBackground.draw(canvas)
|
keyBackground.draw(canvas)
|
||||||
if (label?.isNotEmpty() == true) {
|
if (label?.isNotEmpty() == true) {
|
||||||
|
@ -748,7 +755,6 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||||
|
|
||||||
if (mCurrentKeyIndex != NOT_A_KEY && keys.size > mCurrentKeyIndex) {
|
if (mCurrentKeyIndex != NOT_A_KEY && keys.size > mCurrentKeyIndex) {
|
||||||
val newKey = keys[mCurrentKeyIndex]
|
val newKey = keys[mCurrentKeyIndex]
|
||||||
newKey.onPressed()
|
|
||||||
invalidateKey(mCurrentKeyIndex)
|
invalidateKey(mCurrentKeyIndex)
|
||||||
val keyCode = newKey.codes[0]
|
val keyCode = newKey.codes[0]
|
||||||
sendAccessibilityEventForUnicodeCharacter(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER, keyCode)
|
sendAccessibilityEventForUnicodeCharacter(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER, keyCode)
|
||||||
|
@ -938,7 +944,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||||
}
|
}
|
||||||
|
|
||||||
val popupKey = mKeys[mCurrentKey]
|
val popupKey = mKeys[mCurrentKey]
|
||||||
val result = onLongPress(popupKey)
|
val result = onLongPress(popupKey, me)
|
||||||
if (result) {
|
if (result) {
|
||||||
mAbortKey = true
|
mAbortKey = true
|
||||||
showPreview(NOT_A_KEY)
|
showPreview(NOT_A_KEY)
|
||||||
|
@ -954,7 +960,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||||
* @return true if the long press is handled, false otherwise. Subclasses should call the
|
* @return true if the long press is handled, false otherwise. Subclasses should call the
|
||||||
* method on the base class if the subclass doesn't wish to handle the call.
|
* method on the base class if the subclass doesn't wish to handle the call.
|
||||||
*/
|
*/
|
||||||
protected fun onLongPress(popupKey: MyKeyboard.Key): Boolean {
|
protected fun onLongPress(popupKey: MyKeyboard.Key, me: MotionEvent): Boolean {
|
||||||
val popupKeyboardId = popupKey.popupResId
|
val popupKeyboardId = popupKey.popupResId
|
||||||
if (popupKeyboardId != 0) {
|
if (popupKeyboardId != 0) {
|
||||||
mMiniKeyboardContainer = mMiniKeyboardCache[popupKey]
|
mMiniKeyboardContainer = mMiniKeyboardCache[popupKey]
|
||||||
|
@ -1017,6 +1023,20 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||||
val xOffset = Math.max(0, x)
|
val xOffset = Math.max(0, x)
|
||||||
mMiniKeyboard!!.setPopupOffset(xOffset, y)
|
mMiniKeyboard!!.setPopupOffset(xOffset, y)
|
||||||
|
|
||||||
|
// make sure we highlight the proper key right after long pressing it, before any ACTION_MOVE event occurs
|
||||||
|
val miniKeyboardX = if (xOffset + mMiniKeyboard!!.measuredWidth <= measuredWidth) {
|
||||||
|
xOffset
|
||||||
|
} else {
|
||||||
|
measuredWidth - mMiniKeyboard!!.measuredWidth
|
||||||
|
}
|
||||||
|
var selectedKeyIndex = Math.floor((me.x - miniKeyboardX) / popupKey.width.toDouble()).toInt()
|
||||||
|
selectedKeyIndex = Math.max(0, Math.min(selectedKeyIndex, mMiniKeyboard!!.mKeys.size - 1))
|
||||||
|
for (i in 0 until mMiniKeyboard!!.mKeys.size) {
|
||||||
|
mMiniKeyboard!!.mKeys[i].pressed = i == selectedKeyIndex
|
||||||
|
}
|
||||||
|
mMiniKeyboardSelectedKeyIndex = selectedKeyIndex
|
||||||
|
mMiniKeyboard!!.invalidateAllKeys()
|
||||||
|
|
||||||
val miniShiftStatus = if (isShifted()) SHIFT_ON_PERMANENT else SHIFT_OFF
|
val miniShiftStatus = if (isShifted()) SHIFT_ON_PERMANENT else SHIFT_OFF
|
||||||
mMiniKeyboard!!.setShifted(miniShiftStatus)
|
mMiniKeyboard!!.setShifted(miniShiftStatus)
|
||||||
mPopupKeyboard.contentView = mMiniKeyboardContainer
|
mPopupKeyboard.contentView = mMiniKeyboardContainer
|
||||||
|
@ -1089,6 +1109,13 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||||
val widthPerKey = mMiniKeyboard!!.width / mMiniKeyboard!!.mKeys.size
|
val widthPerKey = mMiniKeyboard!!.width / mMiniKeyboard!!.mKeys.size
|
||||||
var selectedKeyIndex = Math.floor((me.x - coords[0]) / widthPerKey.toDouble()).toInt()
|
var selectedKeyIndex = Math.floor((me.x - coords[0]) / widthPerKey.toDouble()).toInt()
|
||||||
selectedKeyIndex = Math.max(0, Math.min(selectedKeyIndex, mMiniKeyboard!!.mKeys.size - 1))
|
selectedKeyIndex = Math.max(0, Math.min(selectedKeyIndex, mMiniKeyboard!!.mKeys.size - 1))
|
||||||
|
if (selectedKeyIndex != mMiniKeyboardSelectedKeyIndex) {
|
||||||
|
for (i in 0 until mMiniKeyboard!!.mKeys.size) {
|
||||||
|
mMiniKeyboard!!.mKeys[i].pressed = i == selectedKeyIndex
|
||||||
|
}
|
||||||
|
mMiniKeyboardSelectedKeyIndex = selectedKeyIndex
|
||||||
|
mMiniKeyboard!!.invalidateAllKeys()
|
||||||
|
}
|
||||||
|
|
||||||
if (coords[0] - me.x > mPopupMaxMoveDistance || // left
|
if (coords[0] - me.x > mPopupMaxMoveDistance || // left
|
||||||
me.x - (coords[0] + mMiniKeyboard!!.width) > mPopupMaxMoveDistance || // right
|
me.x - (coords[0] + mMiniKeyboard!!.width) > mPopupMaxMoveDistance || // right
|
||||||
|
@ -1109,6 +1136,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||||
val selectedKeyCodes = keys[selectedKeyIndex].codes
|
val selectedKeyCodes = keys[selectedKeyIndex].codes
|
||||||
onKeyboardActionListener!!.onKey(selectedKeyCodes[0], selectedKeyCodes.toIntArray())
|
onKeyboardActionListener!!.onKey(selectedKeyCodes[0], selectedKeyCodes.toIntArray())
|
||||||
}
|
}
|
||||||
|
mMiniKeyboardSelectedKeyIndex = -1
|
||||||
dismissPopupKeyboard()
|
dismissPopupKeyboard()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue