Управление контроллерами телевизора

Для взаимодействия с приложениями на телевизорах требуется дополнительное аппаратное устройство – обычный пульт ДУ, пульт-указка или игровой контроллер. Чтобы обеспечить удобство для пользователей, ваше приложение должно поддерживать ввод с помощью d-pad, обрабатывать отключение контроллеров и поддерживать ввод с помощью контроллеров разных типов, включая пульты с указателем.

Минимальные элементы управления D-pad

По умолчанию для телевизоров используется контроллер D-pad. В целом, приложение должно поддерживать управление с помощью пульта, на котором есть только кнопки "Вверх", "Вниз", "Влево", "Вправо", "Выбрать", "Назад" и "Главный экран". Если для игры обычно требуется контроллер с дополнительными кнопками, попробуйте реализовать поддержку геймплея только с помощью D-pad. В противном случае предупредите пользователя, что требуется контроллер, и позвольте ему выйти из игры с помощью d-pad.

Дополнительную информацию о навигации с помощью контроллеров D-pad для телевизоров можно найти в разделе Навигация на телевизоре.

Обработка отключения контроллера

Контроллеры для телевизоров часто являются устройствами Bluetooth, которые могут пытаться экономить энергию, периодически переходя в спящий режим и отключаясь от телевизора. Это означает, что работа приложения может быть прервана или перезапущена, если оно не настроено для обработки таких событий повторного подключения. Это может произойти в следующих случаях:

  • Во время воспроизведения видео, которое длится несколько минут, d-pad или игровой контроллер могут перейти в спящий режим, отключиться от телевизора и подключиться позже.
  • Во время игры к ней может присоединиться новый игрок, используя игровой контроллер, который ещё не подключен.
  • Во время игры пользователь может выйти из нее и отключить игровой контроллер.

Любое действие в ТВ-приложении, которое может быть прервано отключением и повторным подключением, должно быть настроено на обработку событий повторного подключения в манифесте приложения. В следующем примере кода показано, как включить обработку изменений конфигурации, включая подключение, отключение или повторное подключение клавиатуры или навигационного устройства:

<activity
  android:name="com.example.android.TvActivity"
  android:label="@string/app_name"
  android:configChanges="keyboard|keyboardHidden|navigation"
  android:theme="@style/Theme.Leanback">

  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
  </intent-filter>
  ...
</activity>

Это изменение конфигурации позволяет приложению продолжать работу во время повторного подключения, а не перезапускаться фреймворком Android, что неудобно для пользователя.

Как обрабатывать разные варианты ввода с помощью d-pad

У пользователей телевизоров может быть несколько типов контроллеров, которые они используют со своим телевизором. Например, у пользователя может быть простой D-pad контроллер, пульт-указка или игровой контроллер. Коды клавиш, предоставляемые игровым контроллером, когда он используется для функций D-pad, могут отличаться от кодов клавиш, отправляемых базовым D-pad.

Обрабатывайте разные варианты ввода с помощью d-pad, чтобы пользователю не приходилось переключать контроллеры для работы с приложением. Подробнее о том, как обрабатывать разные варианты ввода…

Поддержка пультов с указателем

Некоторые телевизоры поддерживают пульты с указателем, например аэромыши или пульты с сенсорными панелями. Поддержка пультов-указок позволяет пользователям взаимодействовать с приложением с помощью жестов point-and-click, наведения, пролистывания и перетаскивания. Это делает работу с совместимым оборудованием более удобной, сохраняя при этом полную совместимость с D-pad.

Объявите в манифесте поддержку удаленного указателя

Чтобы указать, что в вашем приложении поддерживается навигация с помощью указателя и сенсорного ввода, настройте манифест приложения, задав для атрибута android.software.leanback.supports_touch <property> значение true внутри элемента <application> (или внутри отдельных элементов <activity>, чтобы настроить поддержку для каждого действия):

<manifest ...>
    <!-- Signal whether the app is adaptive or built just for TV -->
    <uses-feature
        android:name="android.software.leanback"
        android:required="true|false" />
    <!-- Ensure the app can be installed on conventional TVs -->
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <application ...>
        <!-- Signal whether the app supports pointer remotes -->
        <property
            android:name="android.software.leanback.supports_touch"
            android:value="true" />
        ...
    </application>
</manifest>

поддерживают клики, наведение указателя мыши и прокручивание.

При поддержке пультов-указок убедитесь, что компоненты пользовательского интерфейса реагируют соответствующим образом на курсор и сенсорный ввод при следующих взаимодействиях:

  • Нажатие и выбор. Все фокусируемые, выбираемые элементы интерфейса должны реагировать на нажатие с помощью пульта-указки так же, как и на выбор с помощью d-pad (KEYCODE_DPAD_CENTER).
    • Jetpack Compose. Используйте модификаторы Modifier.clickable() или pointerInput. Подробнее о нажатиях…
    • Просмотры. Обработка событий кликов по просмотрам. Подробную информацию можно найти в обзоре событий ввода.
  • Визуальные эффекты при наведении. Добавьте визуальный эффект, который будет появляться, когда пользователь наводит указатель мыши на элемент, который можно выбрать.
  • Прокрутка с помощью жестов. Горизонтальная и вертикальная прокрутка, которая запускается жестом смахивания или пролистывания на сенсорной центральной кнопке d-pad, должна работать плавно для всего прокручиваемого контента.
  • Прокрутка перетаскиванием. Пользователи должны иметь возможность прокручивать контент по вертикали (вверх и вниз) или по горизонтали (влево и вправо) в прокручиваемых контейнерах.
    • Jetpack Compose. Стандартные прокручиваемые контейнеры по умолчанию поддерживают прокрутку с помощью указателя и касания. Информацию о специальных реализациях можно найти в статье Ввод с помощью указателя в Compose.
    • Просмотры. Стандартные прокручиваемые просмотры по умолчанию поддерживают прокрутку касанием. Подробнее о настройке ввода…
  • Перемотка медиаконтента. Во время воспроизведения медиаконтента, например телешоу и фильмов, у пользователей должна быть возможность взаимодействовать с индикатором выполнения (панелью перемотки). Они должны иметь возможность нажимать на него, чтобы переходить к определенному моменту, а также перетаскивать ползунок по индикатору выполнения, чтобы найти нужный момент.

Обработка событий кнопок

Когда пользователь нажимает кнопку на контроллере, ваше приложение получает событие с KeyEvent. Ожидаемое поведение кнопки может быть медиасобытием, например воспроизведением, паузой или остановкой, или событием типа ТВ, например выбором или навигацией. Чтобы пользователям было удобно, назначайте кнопкам контроллера одинаковые действия.

События пользовательского интерфейса на телевизорах

Назначьте кнопкам, генерирующим типы KeyEvent, поведение интерфейса телевизора, как показано в следующей таблице:

KeyEvent Поведение
KEYCODE_BUTTON_B, KEYCODE_BACK Назад
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER Выбор
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT Навигация

Мультимедийные события

Когда пользователь смотрит медиаконтент, назначьте кнопкам, которые генерируют типы KeyEvent, поведение, указанное в таблице ниже. Если ваше приложение управляет MediaSession, используйте MediaControllerAdapter, чтобы вызвать один из методов MediaControllerCompat.TransportControls, показанных в таблице. Обратите внимание, что в этом контексте кнопки выбора действуют как кнопки воспроизведения или паузы.

KeyEvent Вызов TransportControls Поведение
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER play() Воспроизвести
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER pause() Приостановить
BUTTON_R1 skipToNext() Далее
BUTTON_L1 skipToPrevious() Назад
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE fastForward() Перемотать вперед
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE rewind() Перемотать назад
Н/Д stop() Остановить

Обеспечьте правильное поведение кнопки "Назад"

Кнопка "Назад" не должна работать как переключатель. Например, не используйте его для открытия и закрытия меню. Используйте ее только для навигации назад по предыдущим экранам, на которых был игрок.

Поскольку кнопка "Назад" выполняет только линейную навигацию назад, вы можете использовать ее, чтобы выйти из меню в приложении, открытого другой кнопкой, и вернуться в приложение. Последовательное нажатие кнопки "Назад" должно в конечном итоге привести к главному экрану Android TV. Например, игра > экран паузы > главный экран игры > главный экран Android TV или сериал > главный экран ТВ-приложения.

Главный экран Android TV.

Подробнее о том, как разработать навигацию, читайте в статье Проектирование навигации назад и вверх. Подробнее о том, как реализовать обратную навигацию…

Управление контроллерами для игр

При создании игр для Android TV разработайте схему управления, которая будет работать как со стандартными пультами телевизора, так и со специальными игровыми контроллерами.

Поддержка элементов управления d-pad

Планируйте схему управления с учетом D-pad, поскольку этот набор элементов управления используется по умолчанию на устройствах Android TV. Игрок должен иметь возможность использовать кнопки навигации для всех аспектов игры – не только для управления основным игровым процессом, но и для навигации по меню и объявлениям. Поэтому в игре для Android TV не должно быть упоминаний сенсорного интерфейса, например "Нажмите здесь, чтобы продолжить".

От того, как вы настроите взаимодействие игрока с контроллером, может зависеть удобство использования. Вот несколько простых советов:

  • Заранее сообщайте о требованиях к контроллерам. В описании игры в Google Play расскажите пользователям, какие контроллеры поддерживаются. Если для игры лучше подходит геймпад с джойстиком, а не только с D-pad, укажите это. Если контроллер не подходит для игры, у пользователя могут возникнуть проблемы, и он поставит игре низкую оценку.
  • Используйте согласованное назначение кнопок. Интуитивно понятное назначение кнопок – залог удобства для пользователей. Например, используйте кнопку A для подтверждения, а кнопку B – для отмены. Вы также можете предоставить пользователям возможность переназначать кнопки. Подробнее о сопоставлении кнопок…
  • Определяйте возможности контроллера и настраивайте его. Запрашивайте у контроллера информацию о его возможностях, чтобы оптимизировать его работу в игре. Например, если вы хотите, чтобы игрок управлял объектом, размахивая контроллером в воздухе, но у контроллера нет акселерометра и гироскопа, то размахивание не сработает. Запросите контроллер и, если обнаружение движения не поддерживается, переключитесь на альтернативную доступную схему управления. Подробнее о том, как запрашивать возможности контроллера, рассказывается в статье Поддержка контроллеров в разных версиях Android.

Используйте подходящие кнопки

Не на всех контроллерах есть кнопки "Старт", "Поиск" и "Меню". Убедитесь, что интерфейс вашего приложения не зависит от этих кнопок.

Как работать с несколькими контроллерами

Если в игре участвует несколько игроков, у каждого из которых есть свой контроллер, важно сопоставить каждую пару игрок-контроллер. Информацию о том, как реализовать идентификацию по номеру контроллера, можно найти в getControllerNumber().

Обработка отключения контроллера

Если контроллер отключился во время игры, приостановите ее и покажите диалоговое окно с предложением подключить контроллер снова.

Также в диалоговом окне можно предложить советы по устранению неполадок. Например, попросите игрока проверить подключение по Bluetooth. Дополнительную информацию о реализации поддержки устройств ввода можно найти в статьях Обработка действий контроллера и Обзор Bluetooth.

Показать инструкции для контроллера

Если в игре есть визуальные инструкции по управлению, используйте изображение контроллера без брендинга и только с кнопками, совместимыми с Android.

Чтобы посмотреть примеры изображений контроллера, совместимого с Android, скачайте шаблон геймпада для Android TV (ZIP). В нем есть белый контроллер на черном фоне и черный контроллер на белом фоне (см. рисунок 1) в формате PNG и в формате Adobe® Illustrator®.

**Рисунок 1.** Пример инструкций по управлению с помощью шаблона геймпада Android TV.