android 自定义数字软键盘,Android自定义数字键盘
package com.numberkeyboard.android;
/**
* 数字键盘。
*/
public class WNumberKeyboardView extends KeyboardView
implements KeyboardView.OnKeyboardActionListener {
// 用于区分左下角空白的按键
private static final int KEYCODE_EMPTY = -10;
private int mDeleteWidth;
private int mDeleteHeight;
private int mDeleteBackgroundColor;
private Drawable mDeleteDrawable;
private Rect mDeleteDrawRect;
private IOnKeyboardListener mOnKeyboardListener;
public WNumberKeyboardView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
private void init(Context context, AttributeSet attrs,
int defStyleAttr) {
// 获取自定义的属性,详见源码,不再赘述
// TypedArray...
// 设置软键盘按键的布局
Keyboard keyboard = new Keyboard(context, R.xml.keyboard_number);
setKeyboard(keyboard);
setEnabled(true);
setPreviewEnabled(false); // 设置按键没有点击放大镜显示的效果
setOnKeyboardActionListener(this);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 遍历所有的按键
List keys = getKeyboard().getKeys();
for (Keyboard.Key key : keys) {
// 如果是左下角空白的按键,重画按键的背景
if (key.codes[0] == KEYCODE_EMPTY) {
drawKeyBackground(key, canvas, mDeleteBackgroundColor);
}
// 如果是右下角的删除按键,重画按键的背景,并且绘制删除图标
else if (key.codes[0] == Keyboard.KEYCODE_DELETE) {
drawKeyBackground(key, canvas, mDeleteBackgroundColor);
drawDeleteButton(key, canvas);
}
}
}
// 绘制按键的背景
private void drawKeyBackground(Keyboard.Key key, Canvas canvas,
int color) {
ColorDrawable drawable = new ColorDrawable(color);
drawable.setBounds(key.x, key.y,
key.x + key.width, key.y + key.height);
drawable.draw(canvas);
}
// 绘制删除按键
private void drawDeleteButton(Keyboard.Key key, Canvas canvas) {
if (mDeleteDrawable == null) {
return;
}
// 计算删除图标绘制的 Rect
if (mDeleteDrawRect == null || mDeleteDrawRect.isEmpty()) {
// 根据 Drawable 的宽高、设置的参数和按键 Key 的大小计算图标绘制的 Rect
// 具体计算的逻辑代码见源码中,此处不再赘述
}
// 绘制删除的图标
if (mDeleteDrawRect != null && !mDeleteDrawRect.isEmpty()) {
mDeleteDrawable.setBounds(
mDeleteDrawRect.left, mDeleteDrawRect.top,
mDeleteDrawRect.right, mDeleteDrawRect.bottom);
mDeleteDrawable.draw(canvas);
}
}
@Override
public void onKey(int primaryCode, int[] keyCodes) {
// 处理按键的点击事件
// 点击了删除按键
if (primaryCode == Keyboard.KEYCODE_DELETE) {
if (mOnKeyboardListener != null)
mOnKeyboardListener.onDeleteKeyEvent();
}
// 点击了数字按键
else if (primaryCode != KEYCODE_EMPTY) {
if (mOnKeyboardListener != null) {
mOnKeyboardListener.onInsertKeyEvent(
Character.toString((char) primaryCode));
}
}
}
// 0-9 数字的 Character 值
private final List keyCodes = Arrays.asList(
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
/**
* 随机打乱数字键盘上键位的排列顺序。
*/
public void shuffleKeyboard() {
Keyboard keyboard = getKeyboard();
if (keyboard != null && keyboard.getKeys() != null
&& keyboard.getKeys().size() > 0) {
Collections.shuffle(keyCodes); // 随机排序数字
// 遍历所有的按键
List keys = getKeyboard().getKeys();
int index = 0;
for (Keyboard.Key key : keys) {
// 如果按键是数字
if (key.codes[0] != KEYCODE_EMPTY
&& key.codes[0] != Keyboard.KEYCODE_DELETE) {
char code = keyCodes.get(index++);
key.codes[0] = code;
key.label = Character.toString(code);
}
}
setKeyboard(keyboard);
}
}
/**
* 设置键盘的监听事件。
*
* @param listener 监听事件
*/
public void setIOnKeyboardListener(IOnKeyboardListener listener) {
this.mOnKeyboardListener = listener;
}
/**
* 键盘的监听事件。
*/
public interface IOnKeyboardListener {
/**
* 点击数字按键。
*
* @param text 输入的数字
*/
void onInsertKeyEvent(String text);
/**
* 点击了删除按键。
*/
void onDeleteKeyEvent();
}
}
更多推荐



所有评论(0)