Поворотный вход

Некоторые устройства 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-файл на эмулятор, чтобы установить его.

Чтобы проверить поворотный вход на эмуляторе:

  1. В диспетчере SDK используйте вкладку «Инструменты SDK» , чтобы получить эмулятор Android 26.0.3 или более поздней версии.
  2. В Android Studio выберите Инструменты > Android > AVD Manager . Создайте новое устройство Wear с API 25 или выше.
  3. Запустите эмулятор из Android Studio .
  4. Нажмите трехточечное меню в нижней части панели инструментов эмулятора. Нажмите вкладку «Поворотный ввод» в новом окне, чтобы открыть интерфейс поворотного ввода и попробовать прокрутку поворотного ввода.

На следующем видео показан поворотный ввод в эмуляторе: