处理键盘操作

用户将焦点移到可编辑的文本视图(如 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()

例如,以下是 onKeyUp() 实现 针对以下情况之一进行额外处理:

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

其他资源