处理键盘操作

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

其他资源