Ручка GamePad кнопки в JetPack Compose UIAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Ручка GamePad кнопки в JetPack Compose UI

Сообщение Anonymous »

Как я могу обрабатывать кнопку 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Сравнить функцию Windows CompareObjecthandles (ручка, ручка)
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • C# Controller (GamePad) крючок, который может подавлять/блокировать события
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • C# Controller (GamePad) Крюк, который может подавлять/блокировать события [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как мне выполнить приложение GamePad?
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Двойная кнопка Touchpad Нажмите, не распознана как кнопка GamePad [закрыто]
    Anonymous » » в форуме Linux
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»