Telewizory wymagają dodatkowego urządzenia do interakcji z aplikacjami – podstawowego pilota, pilota ze wskaźnikiem lub kontrolera do gier. Aby zapewnić spójne wrażenia użytkownika, aplikacja musi obsługiwać wprowadzanie danych za pomocą pada kierunkowego, obsługiwać kontrolery przechodzące w tryb offline i obsługiwać wprowadzanie danych z różnych typów kontrolerów, w tym pilotów ze wskaźnikiem.
Minimalne elementy sterujące pada kierunkowego
Domyślnym kontrolerem na telewizorze 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, Wybierz, Wstecz i Ekran główny. Jeśli Twoja aplikacja jest grą, która zwykle wymaga kontrolera do gier z dodatkowymi elementami sterującymi, spróbuj umożliwić rozgrywkę tylko za pomocą pada kierunkowego. W przeciwnym razie ostrzeż użytkownika, że kontroler jest wymagany, i pozwól mu wyjść z gry za pomocą pada kierunkowego.
Więcej informacji o nawigacji za pomocą padów kierunkowych na telewizorach znajdziesz w artykule Nawigacja na telewizorze.
Postępowanie w razie odłączenia kontrolera
Kontrolery do telewizorów to często urządzenia 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 uruchomiona ponownie, jeśli nie jest skonfigurowana do obsługi tych zdarzeń ponownego połączenia. Może się tak zdarzyć w tych sytuacjach:
- Podczas odtwarzania filmu, który trwa kilka minut, pad kierunkowy lub kontroler do gier może przejść w tryb uśpienia, odłączyć się od telewizora i połączyć się z nim ponownie później.
- Podczas rozgrywki nowy gracz może dołączyć do gry, używając kontrolera do gier, który nie jest jeszcze połączony.
- Podczas rozgrywki gracz może opuścić grę i odłączyć kontroler do gier.
Każda aktywność aplikacji TV, która podlega zdarzeniom rozłączenia i ponownego połączenia, musi być skonfigurowana w pliku manifestu aplikacji do obsługi zdarzeń ponownego połączenia. Poniższy przykładowy kod pokazuje, jak włączyć aktywność, aby obsługiwać zmiany konfiguracji, w tym podłączanie, odłączanie lub ponowne podłączanie 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 kontynuować działanie po ponownym połączeniu, zamiast być ponownie uruchamianą przez platformę Androida, co nie jest dobrym rozwiązaniem dla użytkownika.
Obsługa różnych sposobów wprowadzania danych za pomocą pada kierunkowego
Użytkownicy telewizorów mogą mieć więcej niż 1 rodzaj kontrolera, którego używają z telewizorem. Użytkownik może na przykład mieć podstawowy pad kierunkowy, pilota ze wskaźnikiem lub kontroler do gier. Kody klawiszy wysyłane przez kontroler do gier, gdy jest on używany do obsługi funkcji pada kierunkowego, mogą się różnić od kodów wysyłanych przez podstawowy pad kierunkowy.
Obsługuj różne rodzaje danych wejściowych z pada kierunkowego, aby użytkownik nie musiał przełączać kontrolerów podczas korzystania z aplikacji. Więcej informacji o obsłudze różnych rodzajów danych wejściowych znajdziesz w artykule Przetwarzanie danych wejściowych z pada kierunkowego.
Obsługa pilotów ze wskaźnikiem
Niektóre telewizory obsługują piloty ze wskaźnikiem, takie jak myszy powietrzne lub piloty z czułymi na dotyk padami kierunkowymi (trackpadami). Obsługa pilotów ze wskaźnikiem umożliwia użytkownikom interakcję z aplikacją za pomocą gestów wskazywania i klikania, najeżdżania, przesuwania i przeciągania. Zapewnia to płynniejsze działanie na zgodnym sprzęcie przy zachowaniu pełnej zgodności z padem kierunkowym.
Deklarowanie w pliku manifestu obsługi zdalnej wskaźnika
Aby wskazać, że po aplikacji można poruszać się za pomocą wskaźnika i dotykowego wprowadzania danych, skonfiguruj plik manifestu aplikacji, ustawiając android.software.leanback.supports_touch
<property> na true w elemencie <application> (lub w poszczególnych elementach <activity>, aby skonfigurować obsługę poszczególnych aktywności):
<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>
obsługują interakcje polegające na kliknięciu, najechaniu kursorem i przewijaniu;
Jeśli obsługujesz piloty ze wskaźnikiem, upewnij się, że komponenty interfejsu odpowiednio reagują na kursor i dotykowe wprowadzanie danych w przypadku tych interakcji:
- Klikanie i wybieranie: wszystkie elementy interfejsu, które można zaznaczyć i na których można ustawić kursor, muszą być klikalne za pomocą pilota ze wskaźnikiem, co odpowiada zachowaniu wyboru za pomocą pada kierunkowego (
KEYCODE_DPAD_CENTER).- Jetpack Compose: użyj modyfikatorów
Modifier.clickable()lubpointerInput. Więcej informacji znajdziesz w sekcji Klikanie i naciskanie. - Widoki: obsługa zdarzeń kliknięcia w widokach. Więcej informacji znajdziesz w omówieniu zdarzeń wejściowych.
- Jetpack Compose: użyj modyfikatorów
- Wizualne stany najechania kursorem: zapewniają wyraźny efekt wizualny po najechaniu kursorem, który wskazuje, kiedy kursor 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żytkownika. - Widoki: zdefiniuj stany najechania kursorem za pomocą obiektów rysowalnych listy stanów z
android:state_hovered="true".
- Jetpack Compose: użyj
- Przewijanie przez przesunięcie i szybkie przesunięcie: przewijanie w poziomie i pionie wywoływane przez przesunięcie lub szybkie przesunięcie na czułym na dotyk środkowym przycisku pada kierunkowego musi działać płynnie we wszystkich treściach, 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, które można przewijać.
- Jetpack Compose: standardowe kontenery z możliwością przewijania domyślnie obsługują przewijanie za pomocą wskaźnika i dotyku. Informacje o implementacjach niestandardowych znajdziesz w artykule Dane wejściowe ze wskaźnika w Compose.
- Widoki: standardowe widoki z możliwością przewijania domyślnie obsługują przewijanie dotykowe. 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) przez wskazywanie i klikanie, aby przejść do wcześniejszej lub późniejszej sygnatury czasowej, 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 KeyEvent. Zamierzonym działaniem przycisku może być zdarzenie multimedialne, takie jak odtwarzanie, wstrzymanie lub zatrzymanie, albo zdarzenie typu telewizyjnego, takie jak wybór lub nawigacja. Aby zapewnić użytkownikom dobre wrażenia, przypisz spójne zachowania do przycisków kontrolera.
Zdarzenia w interfejsie telewizora
Przypisz zachowanie interfejsu telewizora do przycisków, które generują typy KeyEvent, 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 zachowanie do przycisków, które generują typy KeyEvent, jak pokazano w tabeli poniżej. Jeśli aplikacja steruje obiektem MediaSession, użyj MediaControllerAdapter, aby wywołać jedną z metod MediaControllerCompat.TransportControls podanych w tabeli. Pamiętaj, że przyciski wyboru działają w tym kontekście jako przyciski odtwarzania lub wstrzymania.
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 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 wstecz, w stylu menu okruszkowego, przez poprzednie ekrany, na których był gracz.
Przycisk Wstecz umożliwia tylko liniową nawigację wstecz, więc możesz go użyć, aby zamknąć menu w aplikacji otwarte za pomocą innego przycisku i wrócić 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 TV > ekran główny aplikacji TV.
Ekran główny Androida TV.
Więcej informacji o projektowaniu nawigacji znajdziesz w artykule Designing Back and Up navigation (Projektowanie nawigacji Wstecz i W górę). Więcej informacji o implementacji 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 dedykowanymi kontrolerami do gier.
Obsługa pada kierunkowego
Zaplanuj schemat sterowania wokół pada kierunkowego, ponieważ ten zestaw elementów sterujących jest domyślny na urządzeniach z Androidem TV. Gracz musi mieć możliwość korzystania z 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 gra na Androida TV nie odnosi się do interfejsu dotykowego, np. „Kliknij tutaj, aby kontynuować”.
Sposób, w jaki gracz korzysta z kontrolera, może mieć kluczowe znaczenie dla zapewnienia mu doskonałych wrażeń. Nie zapomnij o tych sprawdzonych metodach:
- Z góry poinformuj o wymaganiach dotyczących kontrolera: w opisie w Google Play poinformuj gracza o wszelkich oczekiwaniach dotyczących kontrolerów. Jeśli gra lepiej działa z padem do gier z joystickiem niż z padem kierunkowym, wyraźnie o tym poinformuj. Gracz, który używa nieodpowiedniego kontrolera, może mieć złe wrażenia z rozgrywki i wystawić grze niską ocenę.
- Używaj spójnego mapowania przycisków: intuicyjne mapowanie przycisków jest kluczowe dla wygody użytkowników. Na przykład przestrzegaj przyjętych zwyczajów, używając przycisku A do akceptowania i przycisku B do anulowania. Możesz też zapewnić użytkownikom elastyczność, umożliwiając im 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łaj zapytania do kontrolera o jego możliwości, aby zoptymalizować dopasowanie kontrolera do gry. Możesz na przykład 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ć. Sprawdź kontroler i jeśli nie obsługuje wykrywania ruchu, przełącz się na alternatywny, dostępny schemat sterowania. Więcej informacji o sprawdzaniu możliwości kontrolera znajdziesz w artykule o obsłudze kontrolerów w różnych wersjach Androida.
Używanie odpowiednich przycisków
Nie wszystkie kontrolery do gier mają przyciski Start, Szukaj lub Menu. Upewnij się, że interfejs nie zależy od użycia tych przycisków.
Obsługa wielu kontrolerów
Gdy w grze uczestniczy wielu graczy, z których każdy ma własny kontroler, ważne jest, aby zmapować 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 dialogowym podaj też wskazówki dotyczące rozwiązywania problemów. Możesz na przykład poprosić gracza o sprawdzenie połączenia Bluetooth. Więcej informacji o implementowaniu obsługi urządzeń wejściowych znajdziesz w artykule Obsługa działań kontrolera i omówieniu Bluetooth.
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.
Aby zobaczyć przykładowe obrazy kontrolera zgodnego z Androidem, pobierz szablon pada do gier na Androida TV (ZIP). Zawiera on biały kontroler na czarnym tle i czarny kontroler na białym tle (jak na rysunku 1) w formacie PNG i Adobe® Illustrator®.