是否有一个内置的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
。
发布于 2021-09-11 11:38:17
我认为没有这样的系统修饰符的原因是,你必须向用户展示,通过对启用/禁用的控件使用不同的状态,或者通过使用半透明的覆盖视图等,手势是被禁用的。
但是从技术上讲,使用pointerInput
修饰符可以使用awaitPointerEvent
获取所有的触摸事件。
使用pass = PointerEventPass.Initial
参数,您将在所有子视图之前接收事件,然后您可以将事件标记为已用consumeAllChanges
处理,这样子视图将不再接收它们。
fun Modifier.gesturesDisabled(disabled: Boolean = true) =
pointerInput(disabled) {
// if gestures enabled, we don't need to interrupt
if (!disabled) return@pointerInput
awaitPointerEventScope {
// we should wait for all new pointer events
while (true) {
awaitPointerEvent(pass = PointerEventPass.Initial)
.changes
.forEach(PointerInputChange::consumeAllChanges)
}
}
}
如果您想了解有关自定义手势处理的更多信息,请查看this article
https://stackoverflow.com/questions/69142209
复制相似问题