我开发了一个Android自定义键盘,看起来几乎像原来的一个。它还有特殊键,可以在字母/数字和移位之间切换。除了“SPACE”键(底部的大条)外,所有键似乎都能正常工作。我能够击中中间的空格键但触及右侧和左侧的区域(大约空格键宽度的1/3)不会被识别为触摸。
我已经尝试使用空格键的另一个键码/图标,或者甚至将空格键放在键盘的另一行中,以查看它是否特定于该键或行。但似乎有一个普遍的“最大”宽度,自定义键盘可以有一个键...?我也可以在所有布局中重现(肖像/风景/布局 - 大...)。
下面是我的keypad.xml文件来定义我的键盘。有谁知道这个问题/限制?
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="35dp"
android:horizontalGap="3dp"
android:verticalGap="0.2%p"
android:keyHeight="9%p">
<Row android:keyWidth="9%p" >
<Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
<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="122" android:keyLabel="z"/>
<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:keyLabel="p" />
</Row>
<Row android:keyWidth="9%p" >
<Key android:codes="97" android:keyLabel="a" android:horizontalGap="5%p"
android:keyEdgeFlags="left"/>
<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:keyLabel="l"/>
</Row>
<Row android:keyWidth="9%p" >
<Key android:isSticky="true" android:codes="-2" android:keyLabel="▲" />
<Key android:codes="121" android:keyLabel="y"/>
<Key android:codes="120" android:keyLabel="x"/>
<Key android:codes="99" android:keyLabel="c"/>
<Key android:codes="118" android:keyLabel="v"/>
<Key android:codes="98" android:keyLabel="b"/>
<Key android:codes="110" android:keyLabel="n"/>
<Key android:codes="109" android:keyLabel="m"/>
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete"
android:keyWidth="19%p" android:keyEdgeFlags="right"
android:isRepeatable="true" android:horizontalGap="1.5%p"/>
</Row>
<Row android:horizontalGap="3dp"
android:verticalGap="3dp">
<!-- <Key android:codes="-1" android:keyLabel="123" android:keyWidth="10%p"/> -->
<Key android:codes="-1" android:keyLabel="SYM" android:keyWidth="10%p"/>
<Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space"
android:keyWidth="68%p" android:isRepeatable="true"/>
<Key android:codes="-11" android:isRepeatable="true" android:keyIcon="@drawable/sym_keyboard_enter" android:keyWidth="19%p" android:keyEdgeFlags="right"/>
</Row>
</Keyboard>
答案 0 :(得分:8)
问题似乎是来自Keyboard#getNearestKeys dosent的方法返回宽按钮的正确值。 我通过扩展Keyboard类并覆盖getNearestKeys方法
解决了这个问题这是我添加的代码:
@Override
public int[] getNearestKeys(int x, int y) {
List<Key> keys = getKeys();
for (int i = 0; i < keys.size(); i++) {
if (keys.get(i).isInside(x, y)) return new int[]{i};
}
return new int[0];
}
答案 1 :(得分:0)
上述代码可以工作,但您可能仍会遇到边缘检测问题,因此我建议override
使用相同的函数但实现不同,如下所示:
@Override
public int[] getNearestKeys(int x, int y) {
/* return super.getNearestKeys(x,y);*/
return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)),
Math.max(0, Math.min(y, getHeight() - 1)));
}
您也可以使用注释部分。