当用户将注意力集中到可编辑的文本视图(例如EditText 元素)并且用户连接了硬件键盘时,所有输入都由系统处理。但是,如果您想要自己拦截或直接处理键盘输入,则可以通过从KeyEvent.Callback接口实现回调方法(如onKeyDown()和)来实现onKeyMultiple()。
这两个类Activity和View类都实现了 KeyEvent.Callback接口,所以你应该适当地覆盖这些类的扩展中的回调方法。
注意:在使用KeyEvent类和相关API 处理键盘事件时,您应该期望这些键盘事件仅来自硬件键盘。您绝对不应该依靠软输入法(屏幕键盘)上的任何按键来接收按键事件。
处理单个关键事件
处理个人按键,实施onKeyDown()或onKeyUp()酌情。通常情况下,onKeyUp()如果你想确保你只收到一个事件,你应该使用。如果用户按下并按住按钮,则会onKeyDown()多次调用。
例如,这个实现响应一些键盘按键来控制游戏:
@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传递给回调方法的键。几种方法提供有关修饰键的信息,例如getModifiers() 和getMetaState()。但是,最简单的解决方案是检查您所关心的确切修饰键是否正在用诸如isShiftPressed()和之类的方法按下 isCtrlPressed()。
例如,这里onKeyDown()再次实现了一些额外的处理,以便在按住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);
}
}
Lastest Update:2018.04.17
联系我
QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ
公众号推荐: