Android键盘.Key的背景

Sci*_*cit 8 keyboard android

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

Bar*_*man 5

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

您还必须使用没有填充的背景图像,因此它不会在边缘周围查看.有关如何执行此操作的详细信息,请参阅此帖子:9patch png如何在Android应用中运行

巴里


M星空*_*M星空 5

我自定义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);
    }

}
Run Code Online (Sandbox Code Playgroud)

}

实现效果如下 在此处输入图片说明

该链接:https : //github.com/xuejinwei/NumberKeyboard