如何更改Android软键盘中任意键的关键背景

时间:2013-07-18 03:46:24

标签: android background key android-softkeyboard

我希望键盘上的一些键与其他键不同。

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

enter image description here

根据谷歌的参考文件。我们可以使用“android:keybackground=@drawable/xxx”中的“input.xml”来更改密钥的背景,但它会更改键盘中所有键的背景。

虽然qwerty.xml中的“android:keyicon”可以更改单个键,但它只替换标签。同时,使用“android:keyicon”,图像无法覆盖整个按键,图像将比按键背景小一点。

更改某些键背景的正确方法是什么?

3 个答案:

答案 0 :(得分:14)

目前尚不清楚您是否了解如何创建自定义键盘。如果您没有,here's是一个可下载的小项目,可以创建自定义数字键盘。对于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);
        }            
    }
}

tinted keys

在这种情况下,我没有使用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);
        }
    }
}    

replaced keys

答案 1 :(得分:6)

首先要注意的是,在XML中没有简单的方法可以用Java来完成。

您可以使用以下代码获取密钥列表:

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

获得密钥列表后,您可以使用for循环遍历它们以查找要更改的密钥:

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

Please refer to the documentation here for the properties of Keyboard.Key in Android.您可能希望使用the codes来区分密钥。

您会注意到没有直接的方法来更改密钥的背景颜色。但是,有一种方法可以更改图标,因此您可以使用它来模拟相同的行为。您可以生成包含所需颜色的可绘制对象,并将其设置为图标。您可以使用NinePatchDrawable

您可以在onStartInputView()方法或onDraw()方法中添加此功能。您可以看到一段可能有效的代码here

或者,您可以决定实施自己的键盘。如果您想这样做,可以看到Android实施here。您可以将其复制并直接修改以满足您的需求。

答案 2 :(得分:0)

我无法发表评论,所以我把一个类似的问题链接到我找到的解决方案,我觉得它很好,通过代码来做:

Customize the appearance of a <Key>