Модификатор onIndirectPointerGesture позволяет компоненту получать и реагировать на высокоуровневые события косвенного указателя, например, исходящие от сенсорной панели устройства. Используйте этот модификатор для захвата и обработки жестов, поступающих от сенсорной панели или аналогичного источника.
API surface
Для управления обработкой в приложении можно использовать четыре обратных вызова:
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в родительском контейнере.