13

キーボードの一部のキーを他のキーとは異なるものにしたいと考えています。

たとえば、下の写真のシフト、削除、スペース キーのように:

ここに画像の説明を入力

グーグルの参考資料によると。android:keybackground=@drawable/xxx" " で " "を使用してキーの背景を変更できinput.xmlますが、キーボードのすべてのキーの背景が変更されます。

qwerty.xml の「android:keyicon」は単一のキーを変更できますが、ラベルを置き換えるだけです。一方、「android:keyicon」を使用すると、画像はキー全体をカバーできなくなります。画像はキーの背景よりも少し小さくなります。

一部のキーの背景を変更する正しい方法は何ですか?

4

3 に答える 3

14

カスタム キーボードの作成方法を理解しているかどうかは不明です。そうでない場合は、カスタム数値キーボードを作成するダウンロード可能な小さなプロジェクトを次に示しますそこの CustomKeyboardView クラスまたは独自のカスタム キーボード クラスに、次のメソッドを追加します。onDraw() メソッドをオーバーライドし、コード 7 (この場合は「0」) で定義されたキーの背景を赤で描画し、他のすべてのキーを青で描画します。

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    List<Key> keys = getKeyboard().getKeys();
    for (Key key : keys) {            
        if (key.codes[0] == 7) {
            Log.e("KEY", "Drawing key with code " + key.codes[0]);
            Drawable dr = (Drawable) context.getResources().getDrawable(R.drawable.red_tint);
            dr.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            dr.draw(canvas);

        } else {
            Drawable dr = (Drawable) context.getResources().getDrawable(R.drawable.blue_tint);
            dr.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            dr.draw(canvas);
        }            
    }
}

着色されたキー

この場合、9 パッチの画像は使用しませんでしたが、単純な 50% 透明の正方形の画像だけを使用して、既存のボタンが必要な色で着色されているだけの効果を実現しました。よりカスタムな結果を得るには、ドローアブルを 9 パッチ イメージにして、次のようにします。アイコン付きの 2 つのキーは正しくレンダリングされないことに注意してください。これらは 9 パッチ イメージとして定義されていないためです。また、キーのさまざまな状態に対するさまざまな画像/効果の使用についても説明しませんでした。他の人はそれを行う方法を示しました。

@Override
public void onDraw(Canvas canvas) {
    // super.onDraw(canvas);

    List<Key> keys = getKeyboard().getKeys();
    for (Key key : keys) {
        if (key.codes[0] == 7) {
            NinePatchDrawable npd
                = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.red_key);
            npd.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            npd.draw(canvas);

        } else {
            NinePatchDrawable npd
                = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.blue_key);
            npd.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            npd.draw(canvas);
        }

        Paint paint = new Paint();
        paint.setTextAlign(Paint.Align.CENTER);
        paint.setTextSize(48);
        paint.setColor(Color.GRAY);

        if (key.label != null) {
            canvas.drawText(key.label.toString(), key.x + (key.width / 2),
                            key.y + (key.height / 2), paint);
        } else {
            key.icon.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            key.icon.draw(canvas);
        }
    }
}    

交換した鍵

于 2014-03-17T12:33:36.957 に答える
6

最初に注意すべきことは、XML でこれを行う簡単な方法はなく、Java で行う必要があるということです。

次のコードを使用して、キーのリストを取得できます。

Keyboard keyboard = keyboardView.getKeyboard();
List<Key> keys = keyboard.getKeys();

キーのリストを取得したら、次のような for ループを使用して、それらを反復処理して変更するキーを見つけることができます。

for (Key key : keys) {
    ...
}

Android での Keyboard.Key のプロパティについては、こちらのドキュメントを参照してください。おそらく、キーを区別するためにコードを使用したいと思うでしょう。

キーの背景色を直接変更する方法がないことに気付くでしょう。ただし、アイコンを変更する方法があるため、それを使用して同じ動作をシミュレートできます。必要な色を含むドローアブル オブジェクトを生成し、それをアイコンとして設定できます。NinePatchDrawableを使用できます。

この機能をonStartInputView()メソッドまたはonDraw () メソッドに追加できます。ここで動作していると思われるコードを確認できます。

または、独自のキーボードを実装することもできます。そうしたい場合は、ここで Android の実装を確認できます。これをコピーして、必要に応じて直接変更できます。

于 2014-03-17T09:55:41.030 に答える