手机APP五大秘技之按键处理

编程学堂

2-f13-1-3.jpg
@陈跃峰 爪哇米工作室创始人

虽然新出的手机很多都配置了触摸屏,但还是有大量的手机仅配置了按键,所以手机APP仅仅支持触摸屏是不够的,太有局限性,还需要支持按键处理,这样才能扩大手机APP的实用性和应用范围(本期操作平台是Android)。

优化按键处理

在Android中进行按键处理,要用到以下这些命令:

* onKeyDown(int keyCode, KeyEvent event) 按键按下的命令

* onKeyUp(int keyCode, KeyEvent event) 按键释放的命令

* onKeyLongPress(int keyCode, KeyEvent event) 连续按键的命令

合理分配按键

手机按键跟PC键盘不同,按键数量少,所以合理分配按键就显得尤为关键了,一键操作就是一个不错的解决方法,只用一键就可以处理一个命令,完成一个操作,例如一键启动游戏、一键关闭游戏等。

但是手机键盘有限,一键操作的范围也有限,所以我们还需要用到组合键,例如“数字1+#”组合键可以快速关闭当前运行的程序,“数字2+#”组合键可以实现游戏中的某些复杂操作等。

避免代码重复

由于Android手机都支持触摸屏操作,所以在编写代码时需要兼顾触摸屏和按键的处理,这就要把事件逻辑处理的代码写在单独的命令内部,分别在触摸屏和按键事件中调用,这样就可以避免代码的重复。

小提示 | TIPS

虽然大部分触摸屏响应和按键响应是一样的,例如按钮单击的响应,但有部分操作不一样,例如列表的上下拖动和选择,这些都需要在进行按键处理时单独考虑,不要直接复制触摸屏代码。

APP按键处理代码

本示例的目的是用按键控制九宫格,当用户左右移动方向键时,实现单元格的移动,并实现模拟连续按键的逻辑。

第一步:在Eclipse中选择“File→New→Android Project”打开新建项目窗口,然后设置application name为KeyDemo、package name为com.javamestudio.Android.key、Create Activity为KeyDemoActivity。最后,点击“File→New→Class” 新建一个名为KeyDemoView的类。

第二步:在KeyDemoView类中覆盖onDraw,并添加九宫格绘制代码,关键代码如下所示(完整代码下载地址:http://www.icpcw.com/bzsoft):

//绘制九宫格

for(int i = 0;i < 4;i++){

//水平线

canvas.drawLine(startX, startY + i * cellHeight, startX + 3 * cellWidth, startY + i * cellHeight, paint);

//垂直线

canvas.drawLine(startX + i * cellWidth, startY, startX + i * cellWidth, startY + 3 * cellHeight, paint);

第三步:在KeyDemoView类中的onKeyDown内部编写按键处理代码,主要作用是存储被按下的按键,而具体的逻辑处理则放在线程的run内部,代码如下所示:

switch(keyCode){

case KeyEvent.KEYCODE_DPAD_UP:

keyStates = keyStates | (1 << UP); //记忆按键操作

break;

case KeyEvent.KEYCODE_DPAD_DOWN:

keyStates = keyStates | (1 << DOWN);

break;

case KeyEvent.KEYCODE_DPAD_LEFT:

keyStates = keyStates | (1 << LEFT);

break;

case KeyEvent.KEYCODE_DPAD_RIGHT:

keyStates = keyStates | (1 << RIGHT);

break;

case KeyEvent.KEYCODE_DPAD_CENTER:

keyStates = keyStates | (1 << FIRE);

break;

}

最后选择Eclipse中的KeyDemo,单击鼠标右键,选择“Run As→Android Application”即可(见图)。

6-f13-1-1.jpg

疑问解答

读者提问:Android手机的触摸屏操作,能不能同时作用于两个程序,一个程序在前台显示,一个程序在后台运行。不知道我的这个要求可以实现不,如果能应该怎么做?

陈跃峰:你的这个要求实现不了,因为Android系统只能发送指令给当前显示的程序,后台运行的程序是收不到请求的,除非修改Android系统的内核,但是这样一来就麻烦了,一是难度非常高,二是工作量非常大,三是实用价值不大。如果不是同时作用于两个程序,而是有先后顺序,实现难度也就低多了,你可以考虑一下。