android自定义键盘:触摸区域的空间键未完全覆盖

时间:2013-12-03 12:01:05

标签: android keyboard touch

我开发了一个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="&#9650;" />
        <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="&#49;&#50;&#51;" 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>

2 个答案:

答案 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)));
    }

您也可以使用注释部分。