Gamepad -Tasten in der Jetpack -Kompose -Benutzeroberfläche behandelnAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Gamepad -Tasten in der Jetpack -Kompose -Benutzeroberfläche behandeln

Post by Anonymous »

Wie kann ich mit der Gamepad -Taste in meinem Jetpack -App -UI -UI -Taste mit der Taste des Jetpacks handhaben? Argument, aber es ist eher ein Hit oder ein Miss. Gibt es eine bessere Möglichkeit, dies zu tun?

Code: Select all

@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,
)
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post