处理按键动作
最后更新于:2022-04-01 01:45:55
> 编写:[zhaochunqi](https://github.com/zhaochunqi) - 原文:[http://developer.android.com/training/keyboard-input/commands.html](http://developer.android.com/training/keyboard-input/commands.html)
当预估给予可编辑当文本域焦点时,如一个[EditText](http://developer.android.com/reference/android/widget/EditText.html)元素,而且用户拥有一个实体键盘连接,所有当输入由系统处理。然而如果你想接管或直接处理键盘输入键盘操作,通过实现接口[KeyEvent.Callback](http://developer.android.com/reference/android/view/KeyEvent.Callback.html)的回调方法,如 [onKeyDown()](http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyDown(int, android.view.KeyEvent))和[onKeyMultiple()](http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyMultiple(int, int, android.view.KeyEvent)).
[Activity](# "An activity represents a single screen with a user interface.")和View类都实现了[KeyEvent.Callback](http://developer.android.com/reference/android/view/KeyEvent.Callback.html)的接口,所以通常你只需要在这些重写回调方法来适当的扩展这些类。
> **注意:**当使用KeyEvent类和相关的API处理键盘事件时,你期望的应该是只从实体键盘中接收。你永远不应该指望从一个软键盘(如屏幕键盘)来接受点击事件。
### 处理单个按键点击事件
处理单个的按键点击,实现合适的 [onKeyDown()](http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyDown(int, android.view.KeyEvent)) 或 [onKeyUp()](http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyUp(int, android.view.KeyEvent))。通常,你使用[onKeyUp()](http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyUp(int, android.view.KeyEvent))来确保你只接收一个事件。如果用户点击并按住按钮不放,[onKeyDown()](http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyDown(int, android.view.KeyEvent))会被调用多次。
举例,这是一个对一些按键控制游戏的实现:
~~~
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_D:
moveShip(MOVE_LEFT);
return true;
case KeyEvent.KEYCODE_F:
moveShip(MOVE_RIGHT);
return true;
case KeyEvent.KEYCODE_J:
fireMachineGun();
return true;
case KeyEvent.KEYCODE_K:
fireMissile();
return true;
default:
return super.onKeyUp(keyCode, event);
}
}
~~~
### 处理修饰键
为了对修饰键进行回应如一个组合Shift和Control修饰键,你可以查询[KeyEvent](http://developer.android.com/reference/android/view/KeyEvent.html)传递到回调方法。一些方法提供一些信息关于修饰键如getModifiers() 和 getMetaState()。然而,最简单的解决方案时检查你关心的按键是否被按下了的方法,如 [isShiftPressed()](http://developer.android.com/reference/android/view/KeyEvent.html#isShiftPressed()) 和 [isCtrlPressed()](http://developer.android.com/reference/android/view/KeyEvent.html#isCtrlPressed())。
例如,有一个[onKeyDown()](http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyDown(int, android.view.KeyEvent)) 的实现,当Shift键和一个其他当键按下当时候做一些额外的处理:
~~~
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
...
case KeyEvent.KEYCODE_J:
if (event.isShiftPressed()) {
fireLaser();
} else {
fireMachineGun();
}
return true;
case KeyEvent.KEYCODE_K:
if (event.isShiftPressed()) {
fireSeekingMissle();
} else {
fireMissile();
}
return true;
default:
return super.onKeyUp(keyCode, event);
}
}
~~~