处理键盘操作

当用户将焦点放在可修改的文本视图(例如 EditText 元素)上,并且已连接硬件键盘时,所有输入均由系统处理。但是,如果您想要拦截或直接自行处理键盘输入,可以通过从 KeyEvent.Callback 接口实现回调方法(例如 onKeyDown()onKeyMultiple())完成此操作。

ActivityView 类都会实现 KeyEvent.Callback 接口,因此您通常应该根据具体情况在这些类的扩展中替换这些回调方法。

注意:在使用 KeyEvent 类和相关 API 处理键盘事件时,您应该会发现硬件键盘是此类键盘事件的唯一来源。绝不应该依赖接收软键盘输入法(屏幕键盘)中任何按键对应的按键事件。

处理单个按键事件

如需处理单个按键操作,请根据具体情况实现 onKeyDown()onKeyUp()。通常,如果您想要确保只接收一个事件,应该使用 onKeyUp()。如果用户按住该按钮,系统会多次调用 onKeyDown()

例如,以下实现可以响应某些键盘按键以控制游戏:

Kotlin

    override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_D -> {
                moveShip(MOVE_LEFT)
                true
            }
            KeyEvent.KEYCODE_F -> {
                moveShip(MOVE_RIGHT)
                true
            }
            KeyEvent.KEYCODE_J -> {
                fireMachineGun()
                true
            }
            KeyEvent.KEYCODE_K -> {
                fireMissile()
                true
            }
            else -> super.onKeyUp(keyCode, event)
        }
    }
    

Java

    @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 键与某个按键同时按住时需要进行的一些额外处理:

Kotlin

    override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
        return when (keyCode) {
            ...
            KeyEvent.KEYCODE_J -> {
                if (event.isShiftPressed) {
                    fireLaser()
                } else {
                    fireMachineGun()
                }
                true
            }
            KeyEvent.KEYCODE_K -> {
                if (event.isShiftPressed) {
                    fireSeekingMissle()
                } else {
                    fireMissile()
                }
                true
            }
            else -> super.onKeyUp(keyCode, event)
        }
    }
    

Java

    @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);
        }
    }