【Touch&input 】处理键盘操作(14)

当用户将注意力集中到可编辑的文本视图(例如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

公众号推荐:

【Touch&input 】处理键盘操作(14)

猜你喜欢

转载自blog.51cto.com/4789781/2125391
今日推荐