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

如何更改Android软键盘中任意按键的按键背景,android,background,key,android-softkeyboard,Android,Background,Key,Android Softkeyboard,我想让键盘上的一些键与其他键不同 例如,如shift、delete、空格键在下面的照片中: 根据谷歌的参考文件。我们可以使用“input.xml”中的“android:keybackground=@drawable/xxx”更改按键的背景,但它会更改键盘中所有按键的背景 虽然qwerty.xml中的“android:keycon”可以更改单个键,但它只能替换标签。同时,使用“android:keycon”,图像不能覆盖整个按键,图像会比按键背景小一点 更改某些按键背景的正确方法是什么?我无法发

我想让键盘上的一些键与其他键不同

例如,如shift、delete、空格键在下面的照片中:

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

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


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

我无法发布提示,因此我将一个类似的问题链接到一个类似的问题,我发现有一个我认为很好的解决方案,通过代码执行:


首先要注意的是,在XML中没有简单的方法可以做到这一点,您需要在Java中做到这一点

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

Keyboard keyboard = keyboardView.getKeyboard();
List<Key> keys = keyboard.getKeys();
您可能需要使用来区分键

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

您可以在方法或方法中添加此功能。您可以看到一段假定正在工作的代码


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

不清楚您是否了解如何创建自定义键盘。如果您不这样做,一个可下载的小项目将创建一个自定义数字键盘。在那里的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);
        }            
    }
}
@覆盖
公共空白onDraw(画布){
super.onDraw(帆布);
列表键=getKeyboard().getKeys();
对于(键:键){
if(键代码[0]==7){
Log.e(“键”,“带代码的绘图键”+键代码[0]);
Drawable dr=(Drawable)context.getResources().getDrawable(R.Drawable.red_-tint);
立根博士(x键,y键,x键+宽度键,y键+高度键);
draw博士(帆布);
}否则{
Drawable dr=(Drawable)context.getResources().getDrawable(R.Drawable.blue_-tint);
立根博士(x键,y键,x键+宽度键,y键+高度键);
draw博士(帆布);
}            
}
}

在本例中,我没有使用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);
        }
    }
}    
@覆盖
公共空白onDraw(画布){
//super.onDraw(帆布);
列表键=getKeyboard().getKeys();
用于(键:键){
if(键代码[0]==7){
NinePatch可绘制npd
=(NinePatchDrawable)context.getResources().getDrawable(R.drawable.red_键);
npd.立根(键x、键y、键x+键宽度、键y+键高度);
绘图(画布);
}否则{
NinePatch可绘制npd
=(NinePatchDrawable)context.getResources().getDrawable(R.drawable.blue_键);
npd.立根(键x、键y、键x+键宽度、键y+键高度);
绘图(画布);
}
油漆=新油漆();
paint.setTextAlign(paint.Align.CENTER);
油漆.尺寸(48);
油漆。设置颜色(颜色。灰色);
如果(key.label!=null){
canvas.drawText(key.label.toString(),key.x+(key.width/2),
键y+(键高度/2),油漆);
}否则{
key.icon.setBounds(key.x,key.y,key.x+key.width,key.y+key.height);
key.icon.draw(画布);
}
}
}    

您可以参考以下链接1。[连结1][1]2。[链接2][2][1]:[2]:谢谢!您的示例帮助我在重命名数据包时找到一个bug。我需要删除generateJava并重新生成它。你指的是一个在键上绘制文本的解决方案。这篇文章是关于改变背景的。
@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);
        }
    }
}