处理键盘操作

当用户将焦点放在可修改的文本视图(例如 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);
    }
}

处理辅助键

如需响应辅助键事件(例如,某个按键与 ShiftControl 组合),您可以查询传递给回调方法的 KeyEvent。有几种方法可以提供有关辅助键(例如 getModifiers()getMetaState())的信息。不过,最简单的解决方案是使用 isShiftPressed()isCtrlPressed() 等方法检查您关注的确切辅助键是否正被按下。

例如,以下还是 onKeyUp() 实现,以及在 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);
    }
}