JETPACK中的Handle GamePad按钮组成UI

问题描述 投票:0回答:1

我如何在我的JetPack compase App UI中处理GamePad按钮按钮?

我试图创建一个自定义

Modifier.pressable

聆听事件并调用
onPresses
参数,但这是一个命中或错过的。有更好的方法吗?
@Stable enum class GamepadButton { A, B, X, Y, } data object GamepadDefaults { val SELECT_KEY = GamepadButton.A } // TODO: Better logging @Stable class GamepadEventHandler { private val handlers = mutableListOf<(GamepadButton) -> Unit>() fun registerEventHandler(handler: (GamepadButton) -> Unit): (GamepadButton) -> Unit { handlers.add(handler) return handler } fun unregisterEventHandler(handler: (GamepadButton) -> Unit) { handlers.remove(handler) } fun triggerEvent(button: GamepadButton): Boolean { handlers.forEach { it(button) } Log.d("GamepadEventHandler", "Triggering event for button: $button") return true } } @Composable fun rememberGamepadEventHandler(handler: GamepadEventHandler): GamepadEventHandler = remember { handler } val LocalGamepadEventHandler = compositionLocalOf<GamepadEventHandler> { error("No GamepadEventHandler provided") } @Composable fun Modifier.pressable( onPress: () -> Unit, gamepadButton: GamepadButton? = null, enabled: Boolean = true, canFocus: Boolean = true, indication: Indication? = ripple() ) = composed { val gamepadEventHandler = LocalGamepadEventHandler.current val interactionSource = remember { MutableInteractionSource() } val focusManager = LocalFocusManager.current var focused by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() LaunchedEffect(Unit) { coroutineScope.launch { interactionSource.interactions.collect { if (it is FocusInteraction.Focus && !canFocus) { focusManager.clearFocus() } } } } DisposableEffect(gamepadButton, enabled) { val handlerId = gamepadEventHandler.registerEventHandler { Log.d("GamepadEventHandler", "Registering event for button: $it $gamepadButton, $enabled") if (it == gamepadButton && enabled) { if (focused) onPress() } } onDispose { gamepadEventHandler.unregisterEventHandler(handlerId) } } this .onFocusChanged { focused = it.isFocused || !canFocus } .clickable( enabled = enabled, interactionSource = interactionSource, indication = indication, role = Role.Button, onClick = onPress, ) }

	
android kotlin android-jetpack-compose android-jetpack
1个回答
0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.