我正在尝试为 android 中的替代键创建一个自定义弹出键盘。通过使用默认键盘,我唯一能做的就是为弹出键盘提供自定义布局。
我还需要自定义行为(如Gboard中的行为)例如,
(1) 当一个按钮被长按时,默认情况下它应该突出一个特定的键
(2) 按键可以高亮,也可以通过移动手指来选择(长按按键同时移动手指)
这些是我引用的链接:
任何建议/帮助将不胜感激。
谢谢你。
我正在尝试为 android 中的替代键创建一个自定义弹出键盘。通过使用默认键盘,我唯一能做的就是为弹出键盘提供自定义布局。
我还需要自定义行为(如Gboard中的行为)例如,
(1) 当一个按钮被长按时,默认情况下它应该突出一个特定的键
(2) 按键可以高亮,也可以通过移动手指来选择(长按按键同时移动手指)
这些是我引用的链接:
任何建议/帮助将不胜感激。
谢谢你。
如我所见,您已经查看了这篇文章:
https ://www.blackcj.com/blog/2016/03/30/building-a-custom-android-keyboard
它解释了如何为弹出键盘添加自定义布局。
它允许的唯一自定义是更改键背景和文本颜色。
此外,您可以使用KeyboardView
子类,然后覆盖其方法来实现您的目标,例如onTouchEvent()
捕获运动事件或onDraw()
重新绘制键盘区域:
<org.home.CustomPopupKeyboard
android:id="@android:id/keyboardView"
...
/>
另外,检查黑客的键盘来源:
https ://github.com/klausw/hackerskeyboard
似乎,它使用LatinKeyboardBaseView extends View
弹出键盘的类,在layout/keyboard_popup.xml
.
编辑:
根据Hacker's Keyboard代码,我发现释放键时关闭弹出窗口的唯一方法是创建自己的KeyboardView
类,该类直接扩展View
,然后更改其onTouchEvent()
.
Android的本机KeyboardView
类具有PopupWindow mPopupKeyboard
属性,private
因此您不能对其进行子类化并调用mPopupKeyboard.dismiss()
以隐藏弹出窗口。
从释放键到弹出关闭的链是:
LatinKeyboardBaseView::onTouchEvent()
> case MotionEvent.ACTION_UP: onUpEvent()
>tracker.onUpEvent()
PointerTracker::onUpEvent()
> detectAndSendKey()
>listener.onCancel()
LatinKeyboardBaseView::onCancel()
(OnKeyboardActionListener
接口的实现)dismissPopupKeyboard()
>>mMiniKeyboardPopup.dismiss()
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="@dimen/key_height">
<Row android:keyHeight="2px"></Row>
<Row>
<Key
android:codes="49"
android:keyEdgeFlags="left"
android:keyLabel="1" />
<Key
android:codes="50"
android:keyLabel="2" />
<Key
android:codes="51"
android:keyLabel="3" />
<Key
android:codes="52"
android:keyLabel="4" />
<Key
android:codes="53"
android:keyLabel="5" />
<Key
android:codes="54"
android:keyLabel="6" />
<Key
android:codes="55"
android:keyLabel="7" />
<Key
android:codes="56"
android:keyLabel="8" />
<Key
android:codes="57"
android:keyLabel="9" />
<Key
android:codes="48"
android:keyEdgeFlags="right"
android:keyLabel="0" />
</Row>
<Row>
<Key
android:codes="113"
android:keyEdgeFlags="left"
android:keyLabel="q" />
<Key
android:codes="119"
android:keyLabel="w" />
<Key
android:codes="101"
android:keyLabel="e" />
<Key
android:codes="114"
android:keyLabel="r" />
<Key
android:codes="116"
android:keyLabel="t" />
<Key
android:codes="121"
android:keyLabel="y" />
<Key
android:codes="117"
android:keyLabel="u" />
<Key
android:codes="105"
android:keyLabel="i" />
<Key
android:codes="111"
android:keyLabel="o" />
<Key
android:codes="112"
android:keyEdgeFlags="right"
android:keyLabel="p" />
</Row>
<Row>
<Key
android:codes="97" android:keyLabel="a" android:horizontalGap="5%p"
android:keyEdgeFlags="left" android:popupKeyboard="@xml/keyboard_popup_template"
android:popupCharacters="áăä"/>
<Key
android:codes="115"
android:keyLabel="s" />
<Key
android:codes="100"
android:keyLabel="d" />
<Key
android:codes="102"
android:keyLabel="f" />
<Key
android:codes="103"
android:keyLabel="g" />
<Key
android:codes="104"
android:keyLabel="h" />
<Key
android:codes="106"
android:keyLabel="j" />
<Key
android:codes="107"
android:keyLabel="k" />
<Key
android:codes="108"
android:keyEdgeFlags="right"
android:keyLabel="l" />
</Row>
<Row>
<Key
android:codes="-1" android:keyIcon="@drawable/narrow2"
android:keyWidth="15%p" android:isModifier="true"
android:isSticky="true" android:keyEdgeFlags="left" />
<Key
android:codes="122"
android:keyLabel="z"
android:keyWidth="15%p" />
<Key
android:codes="120"
android:keyLabel="x"
android:keyWidth="15%p" />
<Key
android:codes="99"
android:keyLabel="c"
android:keyWidth="15%p" />
<Key
android:codes="118"
android:keyLabel="v"
android:keyWidth="15%p" />
<Key
android:codes="98"
android:keyLabel="b"
android:keyWidth="15%p" />
<Key
android:codes="110"
android:keyLabel="n"
android:keyWidth="15%p" />
<Key
android:codes="109"
android:keyLabel="m"
android:keyWidth="15%p" />
<Key
android:codes="-5"
android:isRepeatable="true"
android:keyEdgeFlags="right"
android:keyIcon="@drawable/sym_keyboard_delete"
android:keyWidth="20%p" />
</Row>
<Row
android:rowEdgeFlags="bottom"
android:verticalGap="5px">
<Key
android:codes="-2"
android:keyEdgeFlags="left"
android:keyLabel="123"
android:keyWidth="15%p" />
<Key
android:codes="64"
android:keyLabel="\@"
android:keyWidth="10%p" />
<Key
android:codes="-101"
android:keyIcon="@drawable/sym_keyboard_language_switch"
android:keyWidth="10%p" />
<Key
android:codes="32"
android:isRepeatable="true"
android:keyLabel="SPACE"
android:keyWidth="30%p" />
<Key
android:codes="46"
android:keyLabel="."
android:keyWidth="10%p" />
<Key
android:codes="44"
android:keyLabel=","
android:keyWidth="10%p"
android:popupCharacters=".,?!#@"
android:popupKeyboard="@xml/keyboard_popup_template" />
<Key
android:codes="-4"
android:keyEdgeFlags="right"
android:keyLabel="DONE"
android:keyWidth="20%p" />
</Row>
<Row android:keyHeight="2px"></Row>
</Keyboard>
Please try it.