4

最近、Android キーボード ビューで問題が発生しました。

私が達成したかったのは、適切なキーボードで、キーの間隔をピクセル単位で追加でき、残りのスペースはキーの重み付けに応じてキーによって共有されます。

また、パーセンテージ幅が不正確であることもわかりました (行の端が +-6px ずつ異なります)。

4

1 に答える 1

2

各キーには幅があり、通常は 64 ピクセルです。通常の半分の幅のキーには、32px を割り当てます。double の場合は 128px にしました。等。

キーボードは、各キーの幅を決定する「fixKeyboard」と呼ばれる関数を介して実行されます。行ごとに 64px 幅のキーの数を指定すると、キーが機能するサイズにスケーリングされます。(つまり、keysPerStandardRow == キーボードの幅のピクセル数 / 64px)

private void fixKeyboard(Keyboard k, int keysPerStandardRow)
{
    List<Key> keys = k.getKeys();
    int dw = GlobalHelperFunctions.getDisplay(this).getWidth();
    int ttly = 0;
    int divisor = 64 * keysPerStandardRow;
    int ttl_weights = 0;
    for (Key key : keys)
    {
        //See below for the deal with 424242
        int weight = key.width + (key.gap == 424242 ? 0 : key.gap);
        if (key.gap == 424242)
            key.gap = 0;
        else
            key.gap = (ttl_weights + key.gap) * dw / divisor - ttl_weights * dw / divisor;
        key.width = (ttl_weights + key.width) * dw / divisor - ttl_weights * dw / divisor;
        if (key.y != ttly)
        {
            ttl_weights = 0;
            ttly = key.y;
        }
        key.x = ttl_weights * dw / divisor;
        ttl_weights += weight;
    }
}

...

static public Display GlobalHelperFunctions.getDisplay(Context c)
{
    if (c != null)
    {
        WindowManager wm = (WindowManager)c.getSystemService(Context.WINDOW_SERVICE);
        if (wm != null)
        {
            return wm.getDefaultDisplay();
        }
    }
    return null;
}

残念ながら、これで話は終わりではありませんでした。XMLファイルを渡した瞬間に、キーボードビュー/キーボードがキーボードの幅を決定するようです。何らかの理由で私のようにキーを変更した場合、Android はキーを事前に計算されたボックスに戻します。明らかに、私はこれを望んでいませんでした。そこで私がしたことは次のとおりです。各キーの間に大きな水平方向のギャップ (424242px) を定義することで、可能な限り最大の幅を強制し、fixKeyboard を実行するときに 0 にリセットしました。

私はこのアプローチを使用していたので、トリガー番号を使用しないだけで簡単にギャップを定義できます! 例として、必要に応じて使用できる私のQWERTYキーボードを次に示します。

<?xml version="1.0" encoding="utf-8"?>
 <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
         android:keyHeight="80px"
         android:horizontalGap="424242px"
         android:verticalGap="2px" >
     <Row android:keyWidth="64px">
         <Key android:keyLabel="1" android:keycode="KEYCODE_1"/>
         <Key android:keyLabel="2" android:keycode="KEYCODE_2"/>
         <Key android:keyLabel="3" android:keycode="KEYCODE_3"/>
         <Key android:keyLabel="4" android:keycode="KEYCODE_4"/>

         <Key android:keyLabel="5" android:keycode="KEYCODE_5"/>
         <Key android:keyLabel="6" android:keycode="KEYCODE_6"/>
         <Key android:keyLabel="7" android:keycode="KEYCODE_7"/>
         <Key android:keyLabel="8" android:keycode="KEYCODE_8"/>

         <Key android:keyLabel="9" android:keycode="KEYCODE_9" />
         <Key android:keyLabel="0" android:keycode="KEYCODE_0"/>
         <Key android:keyIcon="@android:drawable/ic_input_delete" android:keyOutputText="◁" android:keyWidth="128px" android:codes="0x25C1" android:isRepeatable="true"/>
     </Row>
     <Row android:keyWidth="64px">
         <Key android:keyLabel="q" android:keycode="KEYCODE_Q" />
         <Key android:keyLabel="w" android:keycode="KEYCODE_W"/>
         <Key android:keyLabel="e" android:keycode="KEYCODE_E" />
         <Key android:keyLabel="r" android:keycode="KEYCODE_R" />

         <Key android:keyLabel="t" android:keycode="KEYCODE_T"/>
         <Key android:keyLabel="y" android:keycode="KEYCODE_Y"  />
         <Key android:keyLabel="u" android:keycode="KEYCODE_U"/>
         <Key android:keyLabel="i" android:keycode="KEYCODE_I" />

         <Key android:keyLabel="o" android:keycode="KEYCODE_O" />
         <Key android:keyLabel="p" android:keycode="KEYCODE_P" />
         <Key android:keyLabel="・"/>
         <Key android:keyIcon="@android:drawable/ic_menu_preferences" android:keyOutputText="●" android:codes="0x25CF"/>
     </Row>
     <Row android:keyWidth="64px">
         <Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px" android:horizontalGap="32px"/>
         <Key android:keyLabel="a" android:keycode="KEYCODE_A"/>
         <Key android:keyLabel="s" android:keycode="KEYCODE_S"/>
         <Key android:keyLabel="d" android:keycode="KEYCODE_D"/>

         <Key android:keyLabel="f" android:keycode="KEYCODE_F" />
         <Key android:keyLabel="g" android:keycode="KEYCODE_G"/>
         <Key android:keyLabel="h" android:keycode="KEYCODE_H"/>
         <Key android:keyLabel="j" android:keycode="KEYCODE_J" />

         <Key android:keyLabel="k" android:keycode="KEYCODE_K" />
         <Key android:keyLabel="l" android:keycode="KEYCODE_L" />
         <Key android:keyLabel="ENTER" android:keyOutputText="◒" android:keyWidth="96px"/>
         <Key android:keyLabel="カタ"  android:keyOutputText="◎" android:codes="0x25CE"/>
     </Row>
     <Row android:keyWidth="64px">
         <Key android:keyLabel="「" />
         <Key android:keyLabel="z" android:keycode="KEYCODE_Z"/>
         <Key android:keyLabel="x" android:keycode="KEYCODE_X"/>
         <Key android:keyLabel="c" android:keycode="KEYCODE_C"/>

         <Key android:keyLabel="v" android:keycode="KEYCODE_V" />
         <Key android:keyLabel="b" android:keycode="KEYCODE_B"/>
         <Key android:keyLabel="n" android:keycode="KEYCODE_N"/>
         <Key android:keyLabel="m" android:keycode="KEYCODE_M"/>

         <Key android:keyLabel="、"/>
         <Key android:keyLabel="。"/>
         <Key android:keyLabel="⇧" android:keycode="KEYCODE_SHIFT_RIGHT" android:isModifier="true"/>
         <Key android:keyLabel="HW" android:keyOutputText="◍" android:codes="0x25CD"/>
     </Row>
     <Row android:keyWidth="64px">
         <Key android:keyLabel=" " android:keyWidth="704px"/>
         <Key android:keyLabel="ひら"  android:keyOutputText="◐" android:codes="0x25D0"/>
     </Row>
 </Keyboard>

いくつかの重要なこと: キーの前にギャップを作るために、幅 0 のキーを追加しました。<Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px" android:horizontalGap="32px"/>

別のこと:コントロールキーの場合(IMEメニューを開くキーのように、コードを警告するために特殊文字を使用しました:android:keyOutputText="◐"など.

IMEメニューを開く方法を探すのに時間がかかったので、方法は次のとおりです。 Androidで新しい入力方法を設定/呼び出す方法

HTH、すべてのコードはパブリック ドメインです

于 2013-02-05T03:31:55.157 に答える