Некоторые устройства Wear OS содержат физическую вращающуюся боковую кнопку . Когда пользователь поворачивает кнопку, он прокручивает текущее представление вашего приложения вверх или вниз. Этот тип ввода называется поворотным вводом .
Примечание. Это руководство относится в первую очередь к обработке поворотного ввода с использованием пользовательского интерфейса на основе представления. Дополнительную информацию об обработке вращающегося ввода с помощью Compose для Wear OS см. в разделе Поворотный ввод в Compose .
Многие контейнеры с возможностью прокрутки, такие как ScrollView
, ListView
, HorizontalScrollView
и WearableRecyclerView
, поддерживают поворотный ввод, если у них есть фокус, без необходимости использования кода, специфичного для Wear OS. Наличие фокуса является важным предварительным условием, поскольку в Android 9 (уровень API 28) и более поздних версиях представления не получают фокус неявно.
Сосредоточьтесь на лучших практиках
Чтобы реагировать на события поворотного ввода, прокручиваемый контейнер должен иметь фокус. События поворотного ввода не всплывают в иерархии представлений. Если сфокусированное представление отсутствует или если сфокусированное представление возвращает false
из View.onGenericMotionEvent()
, событие отправляется в Activity.onGenericMotionEvent()
.
Ниже приведены рекомендации по реагированию на события поворотного ввода:
- Имейте в виду, что по умолчанию запуск действия или даже нажатие на представление не приводит к его фокусировке, даже если оно доступно для фокусировки. Чтобы передать фокус представления, представление должно использовать тег
<requestFocus />
или вручную вызватьView.requestFocus()
. - Отметьте пользовательские прокручиваемые представления как доступные для фокусировки, используя
android:focusable="true"
иandroid:focusableInTouchMode="true"
. - Если ваше прокручиваемое представление прикрепляется после
Activity.onCreate()
— например, ожидая завершения сетевого запроса перед созданием пользовательского интерфейса, вызовитеrequestFocus()
после его присоединения. - Если ваше прокручиваемое представление изначально
INVISIBLE
илиGONE
, вызовитеrequestFocus()
, когда вы установите для него значениеVISIBLE
. - Если ваша активность содержит несколько представлений с возможностью прокрутки, выберите одно из них, чтобы сфокусироваться, с помощью тега
<requestFocus />
. Вложенная прокрутка не поддерживается вращающейся боковой кнопкой. - Если ваш пользовательский интерфейс содержит какое-либо другое представление, которое получает фокус, когда пользователь взаимодействует с ним, например,
InputText
, дайте пользователю возможность восстановить фокус на прокручиваемом представлении, если оно теряет фокус, прослушивая нажатия на прокручиваемое представление и вызываяrequestFocus()
в ответ.
Пользовательское поведение вращения
Если ваше прокручиваемое представление изначально не поддерживает прокрутку поворотного ввода или если вы хотите использовать поворотный ввод для чего-то другого, кроме прокрутки, например для увеличения и уменьшения масштаба или поворота дисков, вы можете обрабатывать события прокрутки самостоятельно. Не забудьте убедиться, что ваш взгляд получает фокус, иначе события не будут реализованы.
В следующем фрагменте кода показано, как использовать MotionEvent
, InputDeviceCompat
и ViewConfigurationCompat
для добавления пользовательской прокрутки в представление:
Котлин
myView.setOnGenericMotionListener { v, ev -> if (ev.action == MotionEvent.ACTION_SCROLL && ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER) ) { // Don't forget the negation here val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) * ViewConfigurationCompat.getScaledVerticalScrollFactor( ViewConfiguration.get(context), context ) // Swap these axes to scroll horizontally instead v.scrollBy(0, delta.roundToInt()) true } else { false } }
Ява
myView.setOnGenericMotionListener(new View.OnGenericMotionListener() { @Override public boolean onGenericMotion(View v, MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_SCROLL && ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER) ) { // Don't forget the negation here float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) * ViewConfigurationCompat.getScaledVerticalScrollFactor( ViewConfiguration.get(context), context ); // Swap these axes to scroll horizontally instead v.scrollBy(0, Math.round(delta)); return true; } return false; } });
Протестируйте с помощью эмулятора
Используйте эмулятор Android для имитации поворотной прокрутки ввода на устройстве Wear. Запустите приложение Wear на эмуляторе, чтобы запустить проект, или перетащите APK-файл на эмулятор, чтобы установить его.
Чтобы проверить поворотный вход на эмуляторе:
- В диспетчере SDK используйте вкладку «Инструменты SDK» , чтобы получить эмулятор Android 26.0.3 или более поздней версии.
- В Android Studio выберите Инструменты > Android > AVD Manager . Создайте новое устройство Wear с API 25 или выше.
- Запустите эмулятор из Android Studio .
- Нажмите трехточечное меню в нижней части панели инструментов эмулятора. Нажмите вкладку «Поворотный ввод» в новом окне, чтобы открыть интерфейс поворотного ввода и попробовать прокрутку поворотного ввода.
На следующем видео показан поворотный ввод в эмуляторе: