如何为Android键盘上的每个键设置背景。 KeyboardView android:keyBackground 为所有键提供一个背景。但是我想为每个键设置不同的背景。
答案 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);
}
}
}
答案 2 :(得分:2)
我一直在努力做到这一点。关键背景是在KeyboardView类的onBufferDraw()中绘制的。问题是它是一个私有方法,所以你不能用子类覆盖它。所以我尝试完全复制KeyboardView并修改它,但它使用com.android.internal.R
资源,外部应用程序无权访问。所以这种方法不起作用。
此时开始看起来我必须将Android的键盘类抛出窗口并从头开始编写整个内容 - 所有b / c我无法更改空格键的背景图像。可笑了。
答案 3 :(得分:0)
也许你可以定义一个新的Input Method。