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

use*_*144 13 android background key android-softkeyboard

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

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

在此输入图像描述

根据谷歌的参考文件.我们可以通过android:keybackground=@drawable/xxx在" input.xml"中使用" " 更改键的背景,但它会改变键盘中所有键的背景.

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

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

sco*_*ttt 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);
        }            
    }
}
Run Code Online (Sandbox Code Playgroud)

有色钥匙

在这种情况下,我没有使用9-patch图像,只是一些简单的50%透明方形图像,并且实现了现有按钮仅仅用我想要的颜色着色的效果.为了获得更自定义的结果,我可以制作我的drawables 9-patch图像并执行以下操作.请注意,带有图标的两个键无法正确渲染,因为它们未被定义为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);
        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

更换钥匙


Vla*_*zki 6

首先要注意的是,在XML中没有简单的方法可以做到这一点,你需要用Java来完成它.

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

Keyboard keyboard = keyboardView.getKeyboard();
List<Key> keys = keyboard.getKeys();
Run Code Online (Sandbox Code Playgroud)

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

for (Key key : keys) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

有关Android中Keyboard.Key的属性,请参阅此处的文档.您可能希望使用代码来区分密钥.

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

您可以在onStartInputView()方法或onDraw()方法中添加此功能.你可以看到一段据说可以在这里工作的代码.

或者,您可以决定实施自己的键盘.如果你想这样做,你可以在这里看到Android实现.您可以复制它并直接修改它以满足您的需要.