Модификатор onIndirectPointerGesture позволяет компоненту получать и обрабатывать косвенные события указателя высокого уровня, например те, которые исходят от сенсорной панели устройства. Используйте этот модификатор, чтобы захватывать и обрабатывать жесты, выполненные на сенсорной панели или аналогичном устройстве.
Поверхность API
Для управления обработкой в приложении можно использовать четыре функции обратного вызова:
onClick: срабатывает при успешном нажатии или клике без значительного горизонтального движения.onSwipeForward– срабатывает, когда горизонтальное движение пальцем превышает пороговые значения расстояния и скорости в прямом направлении.onSwipeBackward– срабатывает, когда горизонтальное движение пальцем назад превышает пороговые значения расстояния и скорости.Enabled: если задано значениеfalse, модификатор игнорируется и обратные вызовы не выполняются.
Как система реагирует на прокрутку и смахивание
Система использует пороговое значение, чтобы различать нажатия и пролистывания.
- Если указатель значительно смещается во время нажатия, действие
onClickотменяется. - Если указатель значительно отклоняется от заданного направления, жест смахивания считается недействительным.
Пример: настройка обработки кликов и пролистываний в компоненте
Приведенный ниже код позволяет обрабатывать свайпы и клики по фокусируемому элементу Box:
@Composable fun OnIndirectPointerGestureSample() { var lastGesture by remember { mutableStateOf("None") } Box( modifier = Modifier.fillMaxSize() .onIndirectPointerGesture( enabled = true, onSwipeForward = { lastGesture = "Forward" }, onSwipeBackward = { lastGesture = "Backward" }, onClick = { lastGesture = "Click" }, ) .focusTarget(), contentAlignment = Alignment.Center, ) { Text("Last Gesture: $lastGesture") } }
Ключевые моменты
onIndirectPointerGestureтребует внимания, поэтомуfocusTargetтакже применяется, чтобы сделатьBoxдоступным для фокуса. Вы можете использоватьfocusTargetили другой модификатор, позволяющий включить фокус, напримерsurface. Без фокуса модификатор не может воздействовать на косвенные события указателя.- В этом примере реализованы обратные вызовы
onSwipeForwardиonClick, поэтому обнаруженные жесты пролистывания и нажатия перехватываются и обрабатываются, а не передаются родительским контейнерам. Однако вы также можете оставить определенный обратный вызов нулевым, чтобы передать жест модификаторуonIndirectPointerGestureв родительском контейнере.