Как я могу обрабатывать кнопку 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
Форум для тех, кто программирует под Android
1740319320
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,
)
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79461332/handle-gamepad-buttons-in-jetpack-compose-ui[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия