Zarządzanie kontrolerami TV

Urządzenia TV wymagają dodatkowego urządzenia do interakcji z aplikacjami – podstawowego pilota, pilota wskaźnikowego lub kontrolera do gier. Aby zapewnić spójne wrażenia użytkownika, aplikacja musi obsługiwać wejście z pada kierunkowego, radzić sobie z odłączaniem kontrolerów i obsługiwać wejście z wielu typów kontrolerów, w tym pilotów ze wskaźnikiem.

Minimalne sterowanie za pomocą pada kierunkowego

Domyślnym kontrolerem urządzenia TV jest pad kierunkowy. Ogólnie aplikacja musi być obsługiwana za pomocą pilota, który ma tylko przyciski w górę, w dół, w lewo, w prawo, wybierania, Wstecz i Ekran główny. Jeśli Twoja aplikacja to gra, która zwykle wymaga kontrolera z dodatkowymi elementami sterującymi, spróbuj umożliwić rozgrywkę za pomocą tylko tych elementów sterujących na padzie kierunkowym. W przeciwnym razie ostrzeż użytkownika, że wymagany jest kontroler, i pozwól mu płynnie wyjść z gry za pomocą kontrolera z padem kierunkowym.

Więcej informacji o nawigacji za pomocą kontrolerów z padem kierunkowym na urządzeniach TV znajdziesz w artykule Nawigacja na telewizorze.

Postępowanie w razie odłączenia kontrolera

Piloty do telewizora często są urządzeniami Bluetooth, które mogą próbować oszczędzać energię, okresowo przechodząc w tryb uśpienia i odłączając się od telewizora. Oznacza to, że aplikacja może zostać przerwana lub ponownie uruchomiona, jeśli nie jest skonfigurowana do obsługi tych zdarzeń ponownego połączenia. Może to nastąpić w tych sytuacjach:

  • Podczas odtwarzania kilkuminutowego filmu pad kierunkowy lub kontroler do gier może przejść w tryb uśpienia, odłączyć się od telewizora i ponownie połączyć się później.
  • Podczas rozgrywki nowy gracz może dołączyć do gry za pomocą kontrolera do gier, który nie jest jeszcze podłączony.
  • Podczas rozgrywki gracz może opuścić grę i odłączyć kontroler.

Wszelka aktywność aplikacji TV, która podlega zdarzeniom odłączenia i ponownego połączenia, musi być skonfigurowana do obsługi zdarzeń ponownego połączenia w pliku manifestu aplikacji. Poniższy przykładowy kod pokazuje, jak włączyć obsługę zmian konfiguracji w aktywności, w tym podłączania, odłączania i ponownego podłączania klawiatury lub urządzenia nawigacyjnego:

<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>

Ta zmiana konfiguracji pozwala aplikacji działać dalej po ponownym nawiązaniu połączenia, zamiast być ponownie uruchamianą przez platformę Android, co nie jest dobrym rozwiązaniem z punktu widzenia użytkownika.

Obsługa różnych danych wejściowych z pada kierunkowego

Użytkownicy urządzeń telewizyjnych mogą mieć więcej niż jeden typ kontrolera, którego używają z telewizorem. Użytkownik może na przykład mieć podstawowy kontroler z padem kierunkowym, pilot z wskaźnikiem lub kontroler do gier. Kody klawiszy podawane przez kontroler do gier, gdy jest on używany do funkcji pada kierunkowego, mogą się różnić od kodów klawiszy wysyłanych przez podstawowy pad kierunkowy.

Obsługuj różne sposoby wprowadzania danych za pomocą pada kierunkowego, aby użytkownik nie musiał przełączać kontrolerów w celu korzystania z aplikacji. Więcej informacji o obsłudze różnych sposobów wprowadzania danych znajdziesz w artykule Przetwarzanie danych wejściowych z pada kierunkowego.

Obsługa pilotów wskaźnikowych

Niektóre telewizory obsługują piloty z wskaźnikiem, takie jak myszki powietrzne lub piloty z kierunkowymi padami dotykowymi (trackpadami). Obsługa pilotów z wskaźnikiem umożliwia użytkownikom interakcję z aplikacją za pomocą gestów wskazywania i kliknięcia, najeżdżania kursorem, przesuwania i przeciągania. Zapewnia to płynniejsze działanie na zgodnym sprzęcie przy zachowaniu pełnej zgodności z padem kierunkowym.

Deklarowanie obsługi wskaźnika pilota w manifeście

Aby wskazać, że aplikacja obsługuje nawigację za pomocą wskaźnika i dotyku, skonfiguruj plik manifestu aplikacji za pomocą metadanych android.software.leanback.supports_touch ustawionych na 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>

obsługują interakcje takie jak kliknięcie, najechanie kursorem i przewijanie.

Jeśli obsługujesz piloty wskaźnikowe, upewnij się, że komponenty interfejsu reagują prawidłowo na dane wejściowe z kursora i dotyku w przypadku tych interakcji:

  • Klikanie i wybieranie: wszystkie elementy interfejsu, na których można ustawić fokus i które można wybrać, muszą być klikalne za pomocą pilota ze wskaźnikiem, co odpowiada zachowaniu wyboru za pomocą pada kierunkowego (KEYCODE_DPAD_CENTER).
  • Wizualne stany najechania: zapewniają wyraźny wizualny efekt najechania, który wskazuje, kiedy kursor wskaźnika znajduje się nad elementem, który można wybrać.
    • Jetpack Compose: użyj Modifier.hoverable() lub obserwuj stany najechania kursorem za pomocą InteractionSource. Więcej informacji znajdziesz w artykule Obsługa interakcji użytkowników.
    • Widoki: zdefiniuj stany najechania kursorem za pomocą rysunków z listą stanów z atrybutem android:state_hovered="true".
  • Przewijanie przez przesunięcie i szybkie przesunięcie: przewijanie w poziomie i pionie wywoływane przez przesunięcie lub szybkie przesunięcie na środkowym przycisku pada kierunkowego z funkcją dotykową musi działać płynnie w przypadku wszystkich treści, które można przewijać.
  • Przewijanie przez przeciąganie: użytkownicy muszą mieć możliwość przeciągania, aby przewijać w pionie (w górę i w dół) lub w poziomie (w lewo i w prawo) w kontenerach z możliwością przewijania.
    • Jetpack Compose: standardowe kontenery z możliwością przewijania domyślnie obsługują przewijanie za pomocą wskaźnika i dotyku. W przypadku implementacji niestandardowych zapoznaj się z artykułem Dane wejściowe wskaźnika w Compose.
    • Widoki: standardowe widoki z możliwością przewijania obsługują przewijanie dotykowe domyślnie. Informacje o niestandardowej obsłudze danych wejściowych znajdziesz w sekcji Dotyk i wprowadzanie danych.
  • Przewijanie odtwarzanych multimediów: podczas odtwarzania multimediów (np. programów telewizyjnych i filmów) użytkownicy muszą mieć możliwość interakcji z paskiem postępu odtwarzania (paskiem przewijania) poprzez wskazywanie i kliknięcie, aby przejść do wcześniejszego lub późniejszego znacznika czasu, a także przeciąganie (przewijanie) wzdłuż paska postępu, aby przejść do określonego momentu.

Obsługa zdarzeń przycisków

Gdy użytkownik kliknie przycisk na kontrolerze, aplikacja otrzyma zdarzenie z wartością KeyEvent. Przeznaczeniem przycisku może być zdarzenie multimedialne, takie jak odtwarzanie, wstrzymywanie lub zatrzymywanie, albo zdarzenie związane z telewizją, takie jak wybór lub nawigacja. Aby zapewnić użytkownikom wygodę, przypisz przyciskom kontrolera spójne działanie.

Zdarzenia w interfejsie telewizora

Przypisz do przycisków, które generują typy KeyEvent, zachowanie interfejsu telewizora, jak pokazano w tabeli poniżej:

KeyEvent Zachowanie
KEYCODE_BUTTON_B, KEYCODE_BACK Wstecz
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER Zaznaczenie
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT Nawigacja

Zdarzenia związane z multimediami

Gdy użytkownik ogląda multimedia, przypisz do przycisków zachowania generujące typy KeyEvent zgodnie z tabelą poniżej. Jeśli aplikacja steruje urządzeniem MediaSession, użyj elementu MediaControllerAdapter, aby wywołać jedną z metod MediaControllerCompat.TransportControls pokazanych w tabeli. Pamiętaj, że w tym przypadku przyciski wyboru działają jak przyciski odtwarzania i wstrzymywania.

KeyEvent Wywołanie TransportControls Zachowanie
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER play() Odtwórz
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER pause() Wstrzymaj
BUTTON_R1 skipToNext() Dalej
BUTTON_L1 skipToPrevious() Wstecz
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE fastForward() Przewiń do przodu
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE rewind() Przewiń do tyłu
Nie dotyczy stop() Zatrzymaj

Zapewnij odpowiednie działanie przycisku Wstecz

Przycisk Wstecz nigdy nie może działać jako przełącznik. Nie używaj go na przykład do otwierania i zamykania menu. Używaj go tylko do nawigacji wstecznej, w stylu ścieżki, po poprzednich ekranach, na których był gracz.

Przycisk Wstecz służy tylko do liniowej nawigacji wstecznej, więc możesz go używać do opuszczania menu w aplikacji otwartego za pomocą innego przycisku i powrotu do aplikacji. Kolejne naciśnięcia przycisku Wstecz muszą zawsze prowadzić do ekranu głównego Androida TV. Na przykład: rozgrywka > ekran wstrzymania gry > ekran główny gry > ekran główny Androida TV lub odtwarzanie programu telewizyjnego > ekran główny aplikacji telewizyjnej.

Ekran główny Androida TV.

Więcej informacji o projektowaniu nawigacji znajdziesz w artykule Projektowanie nawigacji Wstecz i W górę. Więcej informacji o wdrażaniu znajdziesz w artykule Zapewnianie prawidłowego przechodzenia wstecz.

Obsługa kontrolerów do gier

Podczas tworzenia gier na Androida TV zaprojektuj schemat sterowania tak, aby działał zarówno ze standardowymi pilotami do telewizora, jak i z dedykowanymi kontrolerami do gier.

Obsługa sterowania za pomocą pada kierunkowego

Zaplanuj schemat sterowania wokół pada kierunkowego, ponieważ jest on domyślnym zestawem sterowania na urządzeniach z Androidem TV. Gracz musi mieć możliwość używania pada kierunkowego we wszystkich aspektach gry – nie tylko do sterowania rozgrywką, ale także do poruszania się po menu i reklamach. Dlatego upewnij się, że w grze na Androida TV nie ma odniesień do interfejsu dotykowego, np. w postaci komunikatu „Kliknij tutaj, aby kontynuować”.

Sposób, w jaki gracz wchodzi w interakcję z kontrolerem, może mieć kluczowe znaczenie dla zapewnienia mu świetnych wrażeń. Nie zapomnij o tych sprawdzonych metodach:

  • Z wyprzedzeniem informuj o wymaganiach dotyczących kontrolera: w opisie w Google Play informuj graczy o wszelkich oczekiwaniach dotyczących kontrolerów. Jeśli gra lepiej nadaje się do pada do gier z joystickiem niż do pada do gier z samym padem kierunkowym, wyraźnie to zaznacz. Gracz, który używa nieodpowiedniego kontrolera, może mieć negatywne wrażenia i przyznać Twojej grze niską ocenę.
  • Stosuj spójne mapowanie przycisków: intuicyjne mapowanie przycisków jest kluczowe dla dobrego wrażenia użytkownika. Na przykład przestrzegaj przyjętych zwyczajów, używając przycisku A do akceptowania i przycisku B do anulowania. Możesz też zapewnić elastyczność, umożliwiając użytkownikowi zmianę mapowania przycisków. Więcej informacji o mapowaniu przycisków znajdziesz w artykule Obsługa działań kontrolera.
  • Wykrywanie możliwości kontrolera i odpowiednie dostosowywanie: wysyłanie do kontrolera zapytań o jego możliwości w celu optymalizacji dopasowania kontrolera do gry. Na przykład możesz chcieć, aby gracz sterował obiektem, machając kontrolerem w powietrzu, ale jeśli kontroler gracza nie ma akcelerometru i żyroskopu, machanie nie będzie działać. Wysyłaj zapytania do kontrolera i jeśli wykrywanie ruchu nie jest obsługiwane, przełącz się na alternatywny, dostępny schemat sterowania. Więcej informacji o zapytaniach dotyczących możliwości kontrolera znajdziesz w artykule Obsługa kontrolerów w różnych wersjach Androida.

Używanie odpowiednich przycisków

Nie wszystkie kontrolery do gier mają przyciski Start, Wyszukaj lub Menu. Upewnij się, że interfejs użytkownika nie zależy od użycia tych przycisków.

Obsługa wielu kontrolerów

Gdy w grę gra kilku graczy, każdy z własnym kontrolerem, ważne jest, aby przypisać każdą parę gracz-kontroler. Informacje o tym, jak wdrożyć identyfikację numeru kontrolera, znajdziesz w artykule getControllerNumber().

Postępowanie w razie odłączenia kontrolera

Jeśli kontroler zostanie odłączony w trakcie rozgrywki, wstrzymaj grę i wyświetl okno z prośbą o ponowne podłączenie kontrolera.

W oknie wyświetlaj też wskazówki dotyczące rozwiązywania problemów z ofertą. Możesz na przykład poprosić odtwarzacz o sprawdzenie połączenia Bluetooth. Więcej informacji o wdrażaniu obsługi urządzeń wejściowych znajdziesz w artykule Obsługa działań kontrolera i w omówieniu Bluetootha.

Pokaż instrukcje dotyczące kontrolera

Jeśli Twoja gra zawiera wizualne instrukcje sterowania, użyj obrazu kontrolera bez elementów marki i uwzględnij tylko przyciski zgodne z Androidem.

Przykładowe zdjęcia kontrolera zgodnego z Androidem znajdziesz w szablonie gamepada Androida TV (ZIP). Zawiera biały kontroler na czarnym tle i czarny kontroler na białym tle – widoczne na ilustracji 1 – w formacie PNG i Adobe® Illustrator®.

**Rysunek 1.** Przykładowe instrukcje dotyczące kontrolera z użyciem szablonu gamepada Androida TV.