Начиная с Wear OS 7 (уровень API 37), платформа для управления жестами одной рукой, а также API, входящий в состав Compose для Wear OS, позволяют пользователям взаимодействовать с вашим приложением без касания.
Изначально поддержка осуществлялась на устройствах Pixel Watch (Pixel Watch 3 и более поздних моделях), но теперь эта платформа доступна всем производителям оборудования. Благодаря использованию этого API поддержка жестов в вашем приложении автоматически масштабируется в рамках экосистемы по мере расширения поддержки оборудования.
Чтобы помочь пользователям находить доступные жесты, не перегружая пользовательский интерфейс, платформа Wear OS предоставляет анимированные индикаторы жестов. Эти визуальные подсказки показывают, где можно выполнить тот или иной жест, а система автоматически регулирует частоту их отображения и отключения в соответствии с предпочтениями пользователя.
Поддерживаемые жесты и действия
В среде Wear OS для управления жестами поддерживаются два типа жестов:
- Основное действие (двойное масштабирование): соответствует главному действию на экране, например, ответу на звонок или переключению воспроизведения мультимедиа.
- Действие «Закрыть» (Поворот запястья): Соответствует навигации назад, закрытию диалогового окна или отмене запроса.
Настройка жестов в Compose
Хотя API для жестов одной рукой может улучшить ваш пользовательский интерфейс, важно помнить, что некоторые устройства и производители оборудования не поддерживают эти жесты. Если API обнаружит, что ваше приложение работает на одном из таких неподдерживаемых устройств, библиотека автоматически ничего не делает, не влияя на стандартное сенсорное взаимодействие.
Как и в стандартных настройках Compose, вы можете включить жесты одной рукой для элементов пользовательского интерфейса с помощью модификаторов . Вы настраиваете жесты вашего приложения в соответствии с выполняемым действием — основным или закрытием — и gestureId для согласования с системными пользовательскими настройками, такими как частота отображения подсказок и частота отключения звука. Вы выражаете эту конфигурацию, создавая объект OneHandedGestureConfiguration ; мы рекомендуем использовать функцию rememberOneHandedGestureConfiguration для его создания. В объекте OneHandedGestureConfiguration также можно указать приоритет жеста.
Функция rememberOneHandedGestureConfiguration отслеживает историю взаимодействия пользователя при перекомпоновке, не раскрывая состояние приложения. После создания конфигурации приложение должно передать её функции Modifier.oneHandedGesture в интерактивном компоненте.
Чтобы помочь пользователям обнаружить доступные жесты, библиотека предоставляет метод OneHandedGestureClickIndicator . Этот метод выступает в качестве обертки, заменяющей свое базовое содержимое, чтобы указать пользователю на доступность действия жеста.
Интерактивные компоненты
Чтобы включить жесты для интерактивного элемента управления, такого как кнопка, создайте конфигурацию, указав OneHandedGestureAction.Primary , и примените модификатор oneHandedGesture . Передайте один и тот же MutableInteractionSource как элементу управления, так и модификатору, чтобы события жестов генерировали визуальную обратную связь при нажатии на элемент управления.
Чтобы включить индикатор жеста, создайте и запомните экземпляр OneHandedGestureClickIndicatorState . Затем, чтобы запустить визуальную обратную связь, вызовите showIndicator внутри функции обратного вызова onGestureAvailable , предоставляемой модификатором oneHandedGesture , которая сигнализирует системе о событии индикации. После вызова компонент на короткое время заменит свое обычное содержимое анимацией жеста.
var isPlaying by remember { mutableStateOf(false) } val onClick = { isPlaying = !isPlaying } val gestureConfig = rememberOneHandedGestureConfiguration( action = OneHandedGestureAction.Primary ) val indicatorState = remember { OneHandedGestureClickIndicatorState() } val coroutineScope = rememberCoroutineScope() val interactionSource = remember { MutableInteractionSource() } Button( onClick = onClick, interactionSource = interactionSource, modifier = Modifier .fillMaxWidth() .oneHandedGesture( gestureConfiguration = gestureConfig, interactionSource = interactionSource, onGestureLabel = if (isPlaying) "pause" else "play", onGestureAvailable = { coroutineScope.launch { indicatorState.showIndicator() } }, onGesture = onClick ) ) { OneHandedGestureClickIndicator( gestureConfiguration = gestureConfig, state = indicatorState ) { Text(if (isPlaying) "Pause" else "Play", modifier = Modifier.fillMaxWidth()) } }
прокручиваемые контейнеры
Для прокручиваемых экранов или списков создайте конфигурацию, указав OneHandedGestureAction.Primary , и примените модификатор oneHandedGesture к вашему контейнеру, вызвав вспомогательную функцию прокрутки, например, scrollDown .
Для визуальной обратной связи при прокрутке можно использовать компонент OneHandedGestureScrollIndicator . Этот компонент функционирует как стандартный индикатор прокрутки, показывающий положение прокрутки, но также может указывать на доступность жеста прокрутки для пользователя. Этот индикатор обычно передается в слот scrollIndicator компонента ScreenScaffold и связан с состоянием прокручиваемого контейнера, например, TransformingLazyColumn . Он также отслеживает состояние OneHandedGestureScrollIndicatorState для управления визуальными переходами.
Чтобы активировать визуальную обратную связь, вызовите метод showIndicator для этого состояния — обычно внутри функции обратного вызова onGestureAvailable модификатора oneHandedGesture . После активации индикатор временно заменит свое стандартное визуальное состояние последовательностью анимации жеста, чтобы предупредить пользователя.
val scrollState = rememberTransformingLazyColumnState() val gestureConfig = rememberOneHandedGestureConfiguration( action = OneHandedGestureAction.Primary, priority = OneHandedGesturePriority.Scrollable ) val indicatorState = remember(gestureConfig) { OneHandedGestureScrollIndicatorState() } val coroutineScope = rememberCoroutineScope() ScreenScaffold( scrollState = scrollState, scrollIndicator = { OneHandedGestureScrollIndicator( gestureConfiguration = gestureConfig, indicatorState = indicatorState, scrollState = scrollState, modifier = Modifier.align(Alignment.CenterEnd) ) } ) { contentPadding -> TransformingLazyColumn( state = scrollState, contentPadding = contentPadding, modifier = Modifier .fillMaxSize() .oneHandedGesture( gestureConfiguration = gestureConfig, onGestureLabel = "scroll", onGestureAvailable = { coroutineScope.launch { indicatorState.showIndicator() } }, onGesture = { OneHandedGestureDefaults.scrollDown(scrollState) } ) ) { items(10) { index -> Text("Item $index", modifier = Modifier.padding(8.dp)) } } }
Сочетайте несколько жестов
Вы можете настроить как жест прокрутки, так и жест щелчка с одним и тем же основным действием, добавив gesturePriority к объекту OneHandedGestureConfiguration :
-
OneHandedGesturePriority.Clickable(highest): Назначить интерактивным элементам управления, например, типаButtonилиCard, чтобы они распознавали жесты, когда отображаются на экране. -
OneHandedGesturePriority.Scrollable(medium): Назначает контейнерам с возможностью прокрутки или постраничной навигации, чтобы они уступали место кликабельным дочерним элементам, но прокручивались, когда не видно кликабельного элемента управления. -
OneHandedGesturePriority.Unspecified(lowest): Неназначенный приоритет. Это значение по умолчанию для жеста, у которого не установленpriority.
Задав явно параметр priority = OneHandedGesturePriority.Clickable для внутренней кнопки и priority = OneHandedGesturePriority.Scrollable для родительского списка, система может демонстрировать такое поведение с приоритетом жестов. Когда пользователь запускает основное действие жестом одной руки, сначала происходит прокрутка списка вниз, пока не станет видна кнопка. Затем фиксируется действие щелчка по кнопке.
Тестирование и отладка жестов с помощью ADB.
Вы можете протестировать жесты одной рукой на физическом устройстве или эмуляторе, не выполняя физических движений запястья, используя Android Debug Bridge ( adb ) и системную службу IWearGestureService .
Включить имитацию жестов
- Убедитесь, что на вашем устройстве Wear OS установлена версия Wear OS 7 (уровень API 37) или выше.
- При тестировании на физическом устройстве, которое не находится на запястье или на зарядном устройстве, отключите состояние датчика вне тела, чтобы устройство оставалось активным:
adb shell cmd sensorservice set-off-body-state 0
Запуск событий жестов с помощью ADB
Для имитации жеста «двойное сжатие» ( Primary действие) выполните следующую команду в оболочке ADB:
adb shell cmd IWearGestureService gesture 1
Для имитации жеста «Поворот запястья» (действие Dismiss ») выполните следующую команду в оболочке ADB:
adb shell cmd IWearGestureService gesture 2
Сбросить отслеживание подсказок жестов
Система отслеживает историю взаимодействия пользователя и отображает плавающие подсказки жестов на основе глобальной настройки частоты (например, «Всегда» или «Ежедневно» ). При отладке индикаторов жестов вашего приложения сбросьте эту историю отслеживания, чтобы подсказки снова отображались для вашего пакета:
adb shell cmd IWearGestureService hint clear <your_package_name>
Чтобы сбросить состояние датчика, расположенного вне тела, после завершения тестирования:
adb shell cmd sensorservice reset-off-body-state
Дополнительные ресурсы
Рекомендации по использованию жестов одной рукой в дизайне см. в разделе «Жесты одной рукой» .
{% verbatim %}Рекомендуем вам
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Руководство по разработке жестов для управления одной рукой