Compose Multiplatform で キーボードショートカットを実装する
概要
Compose Multiplatform で、キーボードショートカット処理を実装する方法を解説します。
仕様
- キーボードの左右カーソルキー(←、→)押下時に、ログを出力させます。
実装
- onKeyEvent で キーイベントをハンドリングします。
- onKeyEvent は Viewがフォーカスされていないと反応しないので、画面起動時にフォーカスを当てます。
commonMain/../ui/screens/MainScreen.kt
val focusRequester = remember { FocusRequester() }
LaunchedEffect(Unit) {
    focusRequester.requestFocus()
}
    
Box(modifier = Modifier
    .onKeyEvent {
        if (it.type == KeyEventType.KeyUp) return@onKeyEvent true
        when (it.key) {
            Key.DirectionLeft -> {
                println("Left")
            }
            Key.DirectionRight -> {
                println("Right")
            }
        }
        true
    }
    .focusRequester(focusRequester)
    .focusable()
) {
    ...
}このままだと、Mac (Designed for iPad) アプリでキー入力した時に音がなってしまうので、音を消すために SwiftUIの onKeyPress を追加します。 onKeyPressは iOS 17.0 以降で使用できます。
iosApp/iosApp/iOSApp.swift
 
@main
struct iOSApp: App {
	var body: some Scene {
		WindowGroup {
			RootView()
                .onKeyPress(.leftArrow) {
                    // キー押下時に音を消すため
                    return .handled
                }
                .onKeyPress(.rightArrow) {
                    return .handled
                }
		}
	}
}