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();

}

}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐