Телевизионным устройствам требуется дополнительное аппаратное устройство для взаимодействия с приложениями — базовый пульт дистанционного управления или игровой контроллер. Поэтому ваше приложение должно поддерживать ввод с помощью крестовины. Кроме того, вашему приложению может потребоваться обработка контроллеров, отключающихся от сети, и ввод данных от более чем одного типа контроллеров.
В этом руководстве обсуждаются требования к обращению с контроллерами для телевизионных устройств.
Минимальные элементы управления 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, чтобы пользователю не приходилось переключать контроллеры для работы с вашим приложением. Дополнительные сведения об обработке вариантов ввода см. в разделе Обработка ввода с помощью навигационной панели .
Обработка событий кнопок
Когда пользователь нажимает кнопку на контроллере, ваше приложение получает событие с 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() | Останавливаться |
Примечание. При использовании MediaSession
не переопределяйте обработку кнопок, специфичных для мультимедиа, таких как KEYCODE_MEDIA_PLAY
или KEYCODE_MEDIA_PAUSE
. Система автоматически запускает соответствующий метод MediaSession.Callback
.
Обеспечьте соответствующее поведение кнопки «Назад».
Кнопка «Назад» никогда не должна действовать как переключатель. Например, не используйте его для открытия и закрытия меню одновременно. Используйте его только для навигации назад по предыдущим экранам, на которых находился игрок.
Поскольку кнопка «Назад» выполняет только линейную обратную навигацию, вы можете использовать ее, чтобы оставить меню в приложении открытым с помощью другой кнопки и вернуться в приложение. Последовательное нажатие кнопки «Назад» всегда должно в конечном итоге приводить к главному экрану Android TV. Например: игра > экран паузы в игре > главный экран игры > главный экран Android TV или воспроизведение телешоу > главный экран ТВ-приложения > главный экран Android TV.
Дополнительные сведения о дизайне навигации см. в разделе Проектирование навигации «Назад» и «Вверх» . Чтобы узнать о реализации, обратитесь к разделу Обеспечение правильной обратной навигации .
Ручки контроллеров для игр
Поддержка элементов управления D-pad
Спланируйте свою схему управления с помощью крестовины, поскольку этот набор элементов управления используется по умолчанию для устройств Android TV. Игрок должен иметь возможность использовать D-pad для всех аспектов игры — не только для управления основным игровым процессом, но и для навигации по меню и рекламе. По этой причине убедитесь, что ваша игра для Android TV не использует сенсорный интерфейс с такими словами, как « Нажмите здесь, чтобы продолжить».
То, как вы формируете взаимодействие игрока с контроллером, может стать ключом к достижению отличного пользовательского опыта. Рассмотрим следующие рекомендации:
- Сообщите заранее о требованиях к контроллерам: используйте описание в Google Play, чтобы сообщить игроку о любых ожиданиях от контроллеров. Если игра лучше подходит для геймпада с джойстиком, чем для игры только с D-pad, дайте это понять. Игрок, который использует неподходящий для игры контроллер, может получить плохой опыт и поставить вашей игре плохую оценку.
- Используйте единообразное сопоставление кнопок: интуитивно понятное сопоставление кнопок является ключом к хорошему пользовательскому опыту. Например, соблюдайте принятые обычаи, используя кнопку A для принятия и кнопку B для отмены . Вы также можете предложить гибкость в виде возможности переназначения. Дополнительные сведения о сопоставлении кнопок см. в разделе Обработка действий контроллера .
- Определите возможности контроллера и соответствующим образом настройте его: запросите контроллер о его возможностях, чтобы оптимизировать соответствие между контроллером и игрой. Например, вы можете захотеть, чтобы игрок управлял объектом, размахивая контроллером в воздухе, но если в контроллере игрока нет акселерометра и гироскопа, размахивание не работает. Опросите контроллер и, если обнаружение движения не поддерживается, переключитесь на альтернативную доступную схему управления. Дополнительные сведения о запросе возможностей контроллера см. в разделе Поддержка контроллеров в разных версиях Android .
Используйте соответствующие кнопки
Не все игровые контроллеры оснащены кнопками «Пуск», «Поиск» и «Меню». Убедитесь, что ваш пользовательский интерфейс не зависит от использования этих кнопок.
Работа с несколькими контроллерами
Когда в игру играют несколько игроков, каждый со своим контроллером, важно сопоставить каждую пару игрок-контроллер. Сведения о том, как реализовать идентификацию номера контроллера, см. в getControllerNumber()
.
Ручка контроллера отсоединяется
Если контроллер отключается в середине игрового процесса, приостановите игру и отобразите диалоговое окно, предлагающее отключенному игроку повторно подключить свой контроллер.
Также предложите советы по устранению неполадок в диалоговом окне. Например, скажите игроку: «Проверьте соединение Bluetooth». Дополнительные сведения о реализации поддержки устройств ввода см. в разделах «Обработка действий контроллера» и «Обзор Bluetooth» .
Показать инструкции контроллера
Если ваша игра содержит визуальные инструкции по управлению игрой, используйте изображение контроллера без фирменного оформления и включите только кнопки, совместимые с Android .
Чтобы получить примеры изображений Android-совместимого контроллера, загрузите шаблон геймпада Android TV (ZIP) . Он включает в себя белый контроллер на черном фоне и черный контроллер на белом фоне (показанный на рисунке 1) в виде файла PNG и файла Adobe® Illustrator®.