【问题标题】:how to change key background of any key in Android soft keyboard如何更改Android软键盘中任意键的键背景
【发布时间】:2013-07-16 20:31:25
【问题描述】:

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

例如下图中的shift、delete、空格键:

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

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

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

【问题讨论】:

标签: android background key android-softkeyboard


【解决方案1】:

不清楚您是否了解如何创建自定义键盘。如果您不这样做,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);
        }            
    }
}

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

【讨论】:

  • 谢谢!您的示例帮助我在重命名数据包时找到错误。我需要删除生成Java并重新生成它。
【解决方案2】:

首先要注意的是,在 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。您可以复制并直接修改它以满足您的需要。

【讨论】:

    【解决方案3】:

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

    Customize the appearance of a <Key>

    【讨论】:

    • 您指的是在键上绘制文本的解决方案。 OP 是关于改变 Key 背景。
    猜你喜欢
    • 2013-03-25
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多