Jetpack Compose: как отключить обнаружение жестов у детей
Есть ли встроенный
Modifier
который отключает любое взаимодействие обнаружения жестов / ввода указателя его дочерних элементов?
например
@Composable
fun Foo() {
Box(modifier = Modifier.gesturesEnabled(enabled = false)) {
BasicText(text = "Hello", modifier = Modifier.clickable { // clickable is not enabled
// ...
})
}
}
Я мог бы свернуть свою (очень простую) реализацию, используя
CompositionLocal
:
val LocalGesturesEnabled = compositionLocalOf { mutableStateOf(true) }
fun Modifier.myClickable(onClick: () -> Unit, enabled: Boolean = true) = composed {
clickable(enabled = enabled && LocalGesturesEnabled.current.value, onClick)
}
Но он не будет работать со сторонними компонентами или с более сложными компонентами, такими как
LazyList
.
1 ответ
Использование модификатора pointerInput
, вы можете получить все события касания с помощью awaitPointerEvent
.
С
pass = PointerEventPass.Initial
вы получите события перед всеми дочерними представлениями, а затем вы можете пометить событие как обработанное с помощью
consumeAllChanges
, чтобы дети больше не получали их.
fun Modifier.gesturesEnabled(enabled: Boolean) =
pointerInput(enabled) {
// if gestures enabled, we don't need to interrupt
if (enabled) return@pointerInput
awaitPointerEventScope {
// we should wait for all new pointer events
while (true) {
awaitPointerEvent(pass = PointerEventPass.Initial)
.changes
.forEach(PointerInputChange::consumeAllChanges)
}
}
}
Если вы хотите узнать больше об обработке пользовательских жестов, ознакомьтесь с этой статьей.