手机APP五大秘技之按键处理
编程学堂

虽然新出的手机很多都配置了触摸屏,但还是有大量的手机仅配置了按键,所以手机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”即可(见图)。

疑问解答
读者提问:Android手机的触摸屏操作,能不能同时作用于两个程序,一个程序在前台显示,一个程序在后台运行。不知道我的这个要求可以实现不,如果能应该怎么做?
陈跃峰:你的这个要求实现不了,因为Android系统只能发送指令给当前显示的程序,后台运行的程序是收不到请求的,除非修改Android系统的内核,但是这样一来就麻烦了,一是难度非常高,二是工作量非常大,三是实用价值不大。如果不是同时作用于两个程序,而是有先后顺序,实现难度也就低多了,你可以考虑一下。