Клавиатура Android.Ключ фон - PullRequest
7 голосов
/ 06 июля 2010

Как я могу установить фоны для каждой клавиши на клавиатуре Android. KeyboardView android: keyBackground предоставляет один фон для всех клавиш.Но я хочу установить разные фоны для каждой клавиши.

Ответы [ 4 ]

5 голосов
/ 28 мая 2011

Если вы пишете свой собственный IME, попробуйте использовать нарисованное для изображения FOREground (с android: keyIcon в XML или Key.icon в Java), равное размеру всего ключа. Это по сути эквивалентно установке фонового изображения одного ключа. Конечно, вы также должны будете включить передний план в ваше изображение.

Вам также придется использовать фоновое изображение без отступов, чтобы оно не заглядывало за края. См. Этот пост для получения подробной информации о том, как это сделать: как работает 9patch png в приложениях для Android

Barry

4 голосов
/ 23 августа 2016

Я настраиваю MyKeyBoradView, расширяю KeyBoardView и переопределяю метод onDraw.

public class MyKeyBoardView extends KeyboardView {
private Context  mContext;
private Keyboard mKeyBoard;

public MyKeyBoardView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.mContext = context;
}

public MyKeyBoardView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.mContext = context;
}

/**
 * ov
 */
@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mKeyBoard = this.getKeyboard();
    List<Key> keys = null;
    if (mKeyBoard != null) {
        keys = mKeyBoard.getKeys();
    }

    if (keys != null) {
        for (Key key : keys) {
            // TODO: 16/8/23  different key set the different background
            if (key.codes[0] == -4) {
                drawKeyBackground(R.drawable.bg_keyboardview_yes, canvas, key);
                drawText(canvas, key);
            }
        }
    }
}

private void drawKeyBackground(int drawableId, Canvas canvas, Key key) {
    Drawable npd = mContext.getResources().getDrawable(
            drawableId);
    int[] drawableState = key.getCurrentDrawableState();
    if (key.codes[0] != 0) {
        npd.setState(drawableState);
    }
    npd.setBounds(key.x, key.y, key.x + key.width, key.y
            + key.height);
    npd.draw(canvas);
}

private void drawText(Canvas canvas, Key key) {
    Rect bounds = new Rect();
    Paint paint = new Paint();
    paint.setTextAlign(Paint.Align.CENTER);


    paint.setAntiAlias(true);

    paint.setColor(Color.WHITE);
    if (key.label != null) {
        String label = key.label.toString();

        Field field;

        if (label.length() > 1 && key.codes.length < 2) {
            int labelTextSize = 0;
            try {
                field = KeyboardView.class.getDeclaredField("mLabelTextSize");
                field.setAccessible(true);
                labelTextSize = (int) field.get(this);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            paint.setTextSize(labelTextSize);
            paint.setTypeface(Typeface.DEFAULT_BOLD);
        } else {
            int keyTextSize = 0;
            try {
                field = KeyboardView.class.getDeclaredField("mLabelTextSize");
                field.setAccessible(true);
                keyTextSize = (int) field.get(this);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            paint.setTextSize(keyTextSize);
            paint.setTypeface(Typeface.DEFAULT);
        }

        paint.getTextBounds(key.label.toString(), 0, key.label.toString()
                .length(), bounds);
        canvas.drawText(key.label.toString(), key.x + (key.width / 2),
                (key.y + key.height / 2) + bounds.height() / 2, paint);
    } else if (key.icon != null) {
        key.icon.setBounds(key.x + (key.width - key.icon.getIntrinsicWidth()) / 2, key.y + (key.height - key.icon.getIntrinsicHeight()) / 2,
                key.x + (key.width - key.icon.getIntrinsicWidth()) / 2 + key.icon.getIntrinsicWidth(), key.y + (key.height - key.icon.getIntrinsicHeight()) / 2 + key.icon.getIntrinsicHeight());
        key.icon.draw(canvas);
    }

}

}

Эффект реализации заключается в следующем enter image description here

Ссылки: https://github.com/xuejinwei/NumberKeyboard

2 голосов
/ 21 марта 2011

Я тоже пытался это сделать. Фон ключа рисуется в onBufferDraw () в классе KeyboardView. Проблема в том, что это закрытый метод, поэтому вы не можете переопределить его подклассом. Поэтому я попытался полностью скопировать KeyboardView и изменить его, но он использует com.android.internal.R ресурсы, к которым внешнее приложение не имеет доступа. Так что такой подход не работает.

В этот момент мне начинает казаться, что я должен выбросить классы клавиатуры Android из окна и написать все с нуля - все потому что я не могу изменить фоновое изображение клавиши пробела. Смешной.

0 голосов
/ 06 июля 2010

Возможно, вы могли бы определить новый Метод ввода .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...