Как я могу обрабатывать кнопку GamePad нажимать на нажатии кнопки в моем jetpack compose ui?
Я пытался создать пользовательский модификатор. аргумент, но это скорее удар или промах. Есть ли лучший способ сделать это?@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 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 { 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,
)
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... compose-ui
Ручка GamePad кнопки в JetPack Compose UI ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
C# Controller (GamePad) крючок, который может подавлять/блокировать события
Anonymous » » в форуме C# - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
C# Controller (GamePad) Крюк, который может подавлять/блокировать события [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Двойная кнопка Touchpad Нажмите, не распознана как кнопка GamePad [закрыто]
Anonymous » » в форуме Linux - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-