13

我希望键盘中的某些键与其他键不同。

例如下图中的 shift、delete、space 键:

在此处输入图像描述

根据google的参考文件。我们可以通过使用“ 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-patch 图像,而只是一些简单的 50% 透明方形图像,并实现了现有按钮仅用我想要的颜色着色的效果。为了获得更自定义的结果,我可以让我的 drawables 9-patch 图像并执行以下操作。请注意,带有图标的两个键无法正确渲染,因为它们没有被定义为 9-patch 图像,并且我没有采取任何特殊措施来使它们在本示例中很好地缩放。我也没有针对按键的不同状态使用不同的图像/效果;其他人已经展示了如何做到这一点。

@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 回答
0

我不能发表评论,所以我放了一个类似问题的链接,我发现有一个我认为很好的解决方案,通过代码来做:

自定义 <Key> 的外观

于 2014-03-14T11:00:36.503 回答