Для взаимодействия с приложениями на телевизоре требуется дополнительное аппаратное устройство — обычный пульт дистанционного управления, указательный пульт или игровой контроллер. Для обеспечения единообразного пользовательского опыта ваше приложение должно поддерживать ввод с помощью крестовины (D-pad), обрабатывать отключение контроллеров и поддерживать ввод с нескольких типов контроллеров, включая указательные пульты.
Минимальное количество элементов управления D-pad
В качестве стандартного контроллера для телевизора используется крестовина (D-pad). Как правило, ваше приложение должно управляться с помощью пульта дистанционного управления, имеющего только кнопки «вверх», «вниз», «влево», «вправо», «выбрать», «назад» и «домой». Если ваше приложение — игра, для которой обычно требуется игровой контроллер с дополнительными элементами управления, постарайтесь обеспечить поддержку игрового процесса только с помощью кнопок D-pad. В противном случае предупредите пользователя о необходимости контроллера и позвольте ему корректно выйти из игры, используя кнопку D-pad.
Для получения дополнительной информации о навигации с помощью D-pad контроллеров на телевизорах см. раздел «Навигация на телевизоре» .
Отключение контроллера рукоятки
Контроллеры для телевизоров часто представляют собой устройства Bluetooth, которые могут пытаться экономить энергию, периодически переходя в спящий режим и отключаясь от телевизора. Это означает, что работа приложения может быть прервана или перезапущена, если оно не настроено на обработку таких событий повторного подключения. Эти события могут происходить в любой из следующих ситуаций:
- Во время воспроизведения видеоролика продолжительностью в несколько минут, крестовина или игровой контроллер могут перейти в спящий режим, отключиться от телевизора и снова подключиться позже.
- Во время игры новый игрок может присоединиться к игре, используя игровой контроллер, который ещё не подключен.
- Во время игры игрок может выйти из игры и отключить игровой контроллер.
Любое приложение для ТВ, в котором происходят события отключения и повторного подключения, должно быть настроено на обработку событий повторного подключения в манифесте приложения. Следующий пример кода демонстрирует, как включить обработку изменений конфигурации для приложения, включая подключение, отключение или повторное подключение клавиатуры или навигационного устройства:
<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, чтобы пользователю не приходилось переключать контроллеры для работы с вашим приложением. Дополнительную информацию об обработке вариаций ввода см. в разделе «Обработка ввода с помощью D-pad» .
Поддержка пультов дистанционного управления
Некоторые телевизионные устройства поддерживают пульты дистанционного управления с указателем, например, беспроводные мыши или пульты с сенсорными навигационными панелями (трекпадами). Поддержка таких пультов позволяет пользователям взаимодействовать с вашим приложением с помощью жестов «навести и щелкнуть», «навести курсор», «провести пальцем» и «перетащить», обеспечивая более плавную работу на совместимом оборудовании при сохранении полной совместимости с D-pad.
Объявите поддержку удалённых указателей в манифесте.
Чтобы указать, что ваше приложение поддерживает навигацию с помощью указателя и сенсорного ввода, настройте манифест приложения, установив для метаданных android.software.leanback.supports_touch значение true :
<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" />
<!-- Signal whether the app supports pointer remotes -->
<meta-data
android:name="android.software.leanback.supports_touch"
android:value="true" />
<application ...>
...
</application>
</manifest>
Поддержка взаимодействия по клику, наведению курсора и прокрутке.
При поддержке пультов дистанционного управления убедитесь, что ваши компоненты пользовательского интерфейса корректно реагируют на ввод курсора и касаний при следующих типах взаимодействия:
- Щелчок и выделение: все фокусируемые и выделяемые элементы пользовательского интерфейса должны быть доступны для щелчка с помощью указателя мыши, что соответствует поведению выделения с помощью D-pad (
KEYCODE_DPAD_CENTER).- Jetpack Compose: используйте модификаторы
Modifier.clickable()илиpointerInput. Для получения более подробной информации см. раздел «Нажмите и удерживайте» . - Представления: обработка событий клика по элементам представления. Для получения более подробной информации см. обзор событий ввода .
- Jetpack Compose: используйте модификаторы
- Визуальные состояния при наведении курсора: обеспечивают четкий визуальный эффект наведения, указывающий на то, когда указатель мыши находится над выбираемым элементом.
- Jetpack Compose: используйте
Modifier.hoverable()или отслеживайте состояния при наведении курсора с помощьюInteractionSource. Дополнительные сведения см. в разделе «Обработка взаимодействий с пользователем» . - Представления: определение состояний при наведении курсора с помощью элементов drawable из списка состояний с
android:state_hovered="true".
- Jetpack Compose: используйте
- Прокрутка с помощью жестов смахивания и перетаскивания: горизонтальная и вертикальная прокрутка, запускаемая жестом смахивания или перетаскивания на сенсорной центральной кнопке 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. Игрок должен иметь возможность использовать D-pad для всех аспектов игры — не только для управления основным игровым процессом, но и для навигации по меню и рекламе. Поэтому убедитесь, что в вашей игре для Android TV нет отсылок к сенсорному интерфейсу, например, « Нажмите здесь, чтобы продолжить».
То, как вы выстраиваете взаимодействие игрока с контроллером, может стать ключом к созданию отличного пользовательского опыта. Рассмотрите следующие лучшие практики:
- Заранее сообщите о требованиях к контроллеру: используйте описание игры в Google Play, чтобы сообщить игроку о любых ожиданиях относительно контроллера. Если игра лучше подходит для геймпада с джойстиком, чем для игры только с крестовиной, четко это укажите. Игрок, использующий неподходящий контроллер, может получить негативный опыт и поставить вашей игре низкую оценку.
- Используйте единообразное назначение кнопок: интуитивно понятное назначение кнопок — залог хорошего пользовательского опыта. Например, придерживайтесь общепринятых правил, используя кнопку A для подтверждения и кнопку B для отмены . Вы также можете обеспечить гибкость, позволив пользователю переназначать кнопки. Для получения дополнительной информации о назначении кнопок см. раздел «Обработка действий контроллера» .
- Определение возможностей контроллера и соответствующая настройка: запросите у контроллера информацию о его возможностях, чтобы оптимизировать соответствие между контроллером и игрой. Например, вы можете предполагать, что игрок будет управлять объектом, размахивая контроллером в воздухе, но если контроллер игрока не оснащен акселерометром и гироскопом, размахивание не сработает. Запросите у контроллера информацию и, если обнаружение движения не поддерживается, переключитесь на альтернативную доступную схему управления. Для получения дополнительной информации о запросе возможностей контроллера см. раздел «Поддержка контроллеров в разных версиях Android» .
Используйте соответствующие кнопки
Не все игровые контроллеры оснащены кнопками «Старт», «Поиск» или «Меню». Убедитесь, что ваш пользовательский интерфейс не зависит от использования этих кнопок.
Обработка нескольких контроллеров
Когда в игру играет несколько игроков, каждый со своим контроллером, важно сопоставить каждую пару «игрок-контроллер». Информацию о том, как реализовать идентификацию номера контроллера, см. в getControllerNumber() .
Отключение контроллера рукоятки
Если контроллер отключается во время игры, поставьте игру на паузу и покажите диалоговое окно с предложением отключившемуся игроку повторно подключить контроллер.
Кроме того, в диалоговом окне могут быть предложены советы по устранению неполадок. Например, можно попросить игрока «Проверить соединение Bluetooth». Дополнительную информацию о реализации поддержки устройств ввода см. в разделах «Обработка действий контроллера» и « Обзор Bluetooth» .
Показать инструкции контроллера
Если ваша игра предоставляет визуальные инструкции по управлению, используйте изображение контроллера без какой-либо фирменной символики и включите только кнопки, совместимые с Android .
Для просмотра примеров изображений контроллера, совместимого с Android, скачайте шаблон геймпада для Android TV (ZIP) . Он включает в себя белый контроллер на черном фоне и черный контроллер на белом фоне — как показано на рисунке 1 — в формате PNG и в формате Adobe® Illustrator®.
