Android键盘。 Key的背景

时间:2010-07-06 10:01:23

标签: android keyboard

如何为Android键盘上的每个键设置背景。 KeyboardView android:keyBackground 为所有键提供一个背景。但是我想为每个键设置不同的背景。

4 个答案:

答案 0 :(得分:5)

如果您正在编写自己的IME,请尝试使用drawable作为FOREground图像(使用XML中的android:keyIcon或Java中的Key.icon),它等于整个键的大小。这基本上相当于设置单个键的背景图像。当然,您还必须在图像中包含前景。

您还必须使用没有填充的背景图像,因此它不会在边缘周围查看。有关如何执行此操作的详细信息,请参阅此帖子:how does a 9patch png work in android apps

百里

答案 1 :(得分:4)

我自定义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 :(得分:2)

我一直在努力做到这一点。关键背景是在KeyboardView类的onBufferDraw()中绘制的。问题是它是一个私有方法,所以你不能用子类覆盖它。所以我尝试完全复制KeyboardView并修改它,但它使用com.android.internal.R资源,外部应用程序无权访问。所以这种方法不起作用。

此时开始看起来我必须将Android的键盘类抛出窗口并从头开始编写整个内容 - 所有b / c我无法更改空格键的背景图像。可笑了。

答案 3 :(得分:0)

也许你可以定义一个新的Input Method