В Wear OS 7 (уровень API 37) и выше платформа для управления жестами одной рукой, а также API, входящий в состав Compose for 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 .
Включить имитацию жестов
Перед имитацией жестов с помощью ADB настройте параметры устройства и переопределение ограничений:
Убедитесь, что на вашем устройстве Wear OS установлена версия Wear OS 7 (уровень API 37) или выше:
adb shell getprop ro.build.version.sdkЕсли вы тестируете на физическом устройстве, которое не находится на вашем запястье или лежит на зарядном устройстве, отмените ограничение на перемещение вне тела, чтобы система управления жестами оставалась активной:
adb shell cmd IWearGestureService override-constraints offbody-state
Запуск событий жестов с помощью ADB
Для имитации жеста двойного сжатия (который является Primary действием на часах Pixel) выполните следующую команду в оболочке ADB:
adb shell cmd IWearGestureService gesture DoublePinch
Для имитации жеста поворота запястья (который на часах Pixel используется Dismiss ) выполните следующую команду в оболочке ADB:
adb shell cmd IWearGestureService gesture WristTurn
Сбросить отслеживание подсказок жестов
Система отслеживает историю взаимодействия пользователя и отображает плавающие подсказки жестов на основе глобальной настройки частоты (например, «Всегда» или «Ежедневно» ). При отладке индикаторов жестов вашего приложения сбросьте эту историю отслеживания, чтобы подсказки снова отображались для вашего пакета:
В
userdebugсборках или эмуляторах:adb shell cmd IWearGestureService hint clear <your_package_name>В розничных (
user) сборках:На коммерческих устройствах без root-доступа
hint clearблокируется системными разрешениями. Чтобы сбросить обнаружение подсказок, очистите локальные данные приложения.adb shell pm clear <your_package_name>
Восстановить ограничения по умолчанию
Чтобы сбросить все переопределения ограничений отладки после завершения тестирования:
adb shell cmd IWearGestureService override-constraints reset
Устранение неполадок при внедрении жестов
Если ваше приложение не принимает симулированные жесты:
Убедитесь, что экран часов включен и активен. Система управления жестами не отправляет жесты приложениям, когда экран выключен или находится в фоновом режиме. Чтобы активировать дисплей с помощью ADB, выполните:
adb shell input keyevent KEYCODE_WAKEUPПроверьте, зарегистрировано ли ваше приложение как активный подписчик жестов и удерживает ли оно в данный момент фокус окна:
adb shell cmd IWearGestureService get-active-gestures -readableКогда экран жестов вашего приложения находится на переднем плане и экран активен, эта команда возвращает
[DoublePinch]или[DoublePinch, WristTurn]. Если возвращается пустой список ([]), проверьте, находится ли ваше окно в фокусе или не блокируют ли активацию ограничения, выходящие за пределы тела окна.Проверьте состояние внутренней службы жестов и активные токены подписчиков:
adb shell dumpsys IWearGestureService
Дополнительные ресурсы
Рекомендации по использованию жестов одной рукой в дизайне см. в разделе «Жесты одной рукой» .
{% verbatim %}Рекомендуем вам
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Руководство по разработке жестов для управления одной рукой