Как изменить ключевой фон любого ключа в мягкой клавиатуре Android

Я хочу, чтобы некоторые из моих клавиш на клавиатуре отличались от других.

Например, например, сдвиг, удаление, пробел в нижней части фотографии:

enter image description here

В соответствии с справочными документами из Google. Мы можем изменить ключевой фон, используя "android:[email protected]/xxx" в "input.xml", но он меняет фон всех клавиш на клавиатуре.

Хотя "android: keyicon" в qwerty.xml может иметь один ключ, но он заменяет только метку. Между тем, используйте "android:keyicon", изображение не может покрыть всю клавишу, изображение будет меньше, чем фон ключа.

Каков правильный способ изменения фона некоторых клавиш?

Ответ 1

Не понятно, понимаете ли вы, как создать пользовательскую клавиатуру или нет. Если вы этого не сделаете, здесь - небольшой загружаемый проект, который создает пользовательскую цифровую клавиатуру. Для класса 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-патч-изображения, а просто прост 50% прозрачных квадратных изображений и получил эффект, когда существующие кнопки просто тонированы цветами, которые я хотел. Чтобы получить более индивидуальный результат, я мог бы сделать мои рисунки 9-патч-изображениями и сделать следующее. Обратите внимание, что два ключа с значками не отображаются правильно, потому что они не определены как 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);
        }
    }
}    

replaced keys

Ответ 2

Первое, что нужно отметить, это простой способ сделать это в XML, вам нужно будет сделать это на Java.

Вы можете получить список ключей, используя следующий фрагмент кода:

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

Как только у вас есть список ключей, вы можете перебирать их, чтобы найти те, которые хотите изменить, используя цикл for, например:

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

Обратитесь к документации по свойствам Keyboard.Key на Android. Вы, вероятно, захотите использовать коды, чтобы различать ключи.

Вы заметите, что нет прямого способа изменить цвет фона ключа. Тем не менее, есть способ изменить значок, поэтому вы можете использовать его для имитации того же поведения. Вы можете создавать объекты с рисунком, которые содержат нужный вам цвет, и устанавливать его как значок. Вы можете использовать NinePatchDrawable.

Вы можете добавить эту функциональность либо в метод onStartInputView(), либо в onDraw(). Вы можете увидеть фрагмент кода, который предположительно работает здесь.

В качестве альтернативы вы можете решить реализовать свою собственную клавиатуру. Если вы хотите это сделать, вы можете увидеть реализацию Android здесь. Вы можете скопировать это и изменить его прямо в соответствии с вашими потребностями.

Ответ 3

Я не могу опубликовать комменты, поэтому я поставил ссылку на аналогичный вопрос, который нашел, где есть решение, которое, я думаю, хорошо, делая это по коду:

Настроить внешний вид <Key>