Sugestie dotyczące obracania

W Androidzie 8.0 użytkownicy mogli przełączać się między trybami automatycznego obracania i obracania w orientacji pionowej za pomocą kafelka Szybkie ustawienia lub ustawień wyświetlacza. W Androidzie 9 zaktualizowaliśmy tryb obracania w pionie, aby wyeliminować niezamierzone obracanie, przypinając bieżące ustawienie orientacji ekranu nawet wtedy, gdy zmienia się położenie urządzenia. W razie potrzeby użytkownicy mogą ręcznie włączyć rotację, naciskając nowy przycisk na pasku nawigacji. Zmieniliśmy nazwę trybu pionowego na blokada orientacji. Tryb ten jest aktywowany, gdy autoobracanie jest wyłączone. Nie wprowadziliśmy żadnych zmian w trybie automatycznego obracania.

Gdy urządzenie jest w trybie blokady orientacji, użytkownicy mogą zablokować ekran na dowolną orientację obsługiwaną przez widoczną na górze aktywność (z uwzględnieniem bieżących ograniczeń systemu). Jeśli główna aktywność może być renderowana w różnych orientacjach w trybie automatycznego obracania, te same opcje powinny być dostępne w trybie zablokowanej orientacji, z niektórymi wyjątkami związanymi z ustawieniem screenOrientationaktywności.

Tryb blokady obrotu polega na wyświetleniu przycisku na pasku nawigacji po zmianie orientacji urządzenia. Aby to zrobić, czujnik orientacji urządzenia musi pozostać aktywny, nawet gdy automatyczne obracanie jest wyłączone. Kliknięcie tego przycisku spowoduje ustawienie preferencji użytkownika dotyczących obracania (Settings.System.USER_ROTATION). WindowManager używa tych preferencji wraz z innymi szczegółami dotyczącymi głównej aktywności i stanu systemu, aby zmienić obracanie systemu. WindowManager nadal używa preferencji użytkownika dotyczącej rotacji podczas podejmowania decyzji o tym, jaką rotację ma renderować system podczas przechodzenia do innej aktywności.

Ten plik GIF pokazuje telefon w orientacji poziomej z ekranem w orientacji pionowej. Pojawia się ikona z pytaniem, czy użytkownik chce zmienić orientację ekranu na poziomą.
Rysunek 1. Obrócić przycisk sugestii po włączeniu gestu „Przesuń w górę po przycisku ekranu głównego”

Ustawienia dotyczące rotacji użytkowników powinny być zachowane podczas przełączania się między aktywnościami. Jednak ponieważ większość użytkowników telefonów chce korzystać z orientacji poziomej tylko przez krótki czas, dodaliśmy naturalne ustawienie orientacji. Ustawienie orientacji użytkownika zostaje zresetowane do naturalnej orientacji urządzenia, gdy orientacja systemu zmieni się na naturalną orientację urządzenia. W przypadku większości telefonów naturalną orientacją urządzenia jest orientacja pionowa (0°). Zresetowanie ustawień orientacji użytkownika często występuje, gdy użytkownik korzysta z aplikacji tylko w orientacji pionowej, blokuje telefon lub wraca do obszaru roboczego wygaszacza.

W ostatniej dekadzie interakcje użytkowników z rotacją nie zmieniły się zbytnio. Ta funkcja może być trudna do odkrycia przez użytkowników ze względu na ich wcześniejsze doświadczenia z obrótem i pozycjonowaniem przycisków na pasku nawigacyjnym. Z tego powodu dodaliśmy do przycisku obracania tryb wprowadzający, który wyróżnia go, gdy się pojawi. Tryb wprowadzający działa tylko podczas pierwszych kilku interakcji z przyciskami, po których zostaje wyłączony.

Źródło

Dodano obsługę sugestii dotyczących obracania w Androidzie 9. Większość zmian znajduje się w tych plikach:

  • services/.../server/policy/PhoneWindowManager.java:
    • haka korzystającego z wyjścia funkcji WindowOrientationListener (MyOrientationListener, odpowiedzialnego za monitorowanie czujników w celu określenia, czy urządzenie zostało obrócone).
    • Utrzymuje WindowOrientationListener aktywne nawet wtedy, gdy automatyczne obracanie jest wyłączone (patrz needSensorRunningLp()).
    • Oblicza rotację systemu na podstawie preferencji użytkownika, ustawień aktywności screenOrientation i stanu systemu (zob. rotationForOrientationLw()).
    • Określ, czy najlepsza aktywność może się obracać o określony kąt (patrz: isRotationChoicePossible()).
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • Określa, czy przycisk nawigacji powinien być wyświetlany podczas rotacji sugestie z poziomu PhoneWindowManager (zob. onRotationProposal())
    • Obsługuje ukrywanie przycisku nawigacji poziomej (patrz wywołania do setRotateSuggestionButtonState(false)).
    • Obsługuje limity czasu przycisków, w tym szczególny przypadek, gdy pasek nawigacyjny jest ukryty (zazwyczaj w trybie pełnoekranowym).
    • Resetuje ustawienia użytkownika po powrocie do naturalnej orientacji urządzenia (mRotationWatcher).
    • Wybiera odpowiedni styl animacji przycisku nawigacji, stosowanej w NavigationBarView (patrz onRotationProposal()).
    • Dodaje logikę trybu wprowadzenia, w tym specjalną animację (patrz odniesienia do Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED).
    • Wdrożenie flagi disable2 rotation (patrz disable())
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • Animacja ikony przycisku stylów dopasowana do oczekującej rotacji (patrz: updateRotateSuggestionButtonStyle())
    • Obsługuje zmiany widoczności przycisków (patrz: setRotateButtonVisibility()), w tym logikę ukrywania przycisku obracania, jeśli są aktywne określone usługi ułatwień dostępu (uwzględniając ranking przycisków w najbardziej wysuniętym w prawo miejscu nawigacji).
  • SystemUI/res/layout/menu_ime.xml:
    • zawiera nowy przycisk KeyButtonView do obracania, umieszczony nad menu i wybierakiem metody wprowadzania tekstu lub klawiatury, ale poniżej przycisku ułatwień dostępu;
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • Złożony element AnimatedVectorDrawable służący do animowania przycisku nawigacji
    • Stylizacja (w SystemUI/res/values/styles.xml) służy do ustawiania kątów początkowego i końcowego obrotu, aby można było używać tego samego obiektu do rysowania do animowania różnych początkowych i końcowych obrotów.
    • Zabarwienie ikony jest ustawiane za pomocą TintedKeyButtonDrawable

Implementacja

Android 9 zawiera wszystkie niezbędne zmiany, aby sugestie dotyczące obracania działały na urządzeniach, które korzystają z klawiszy nawigacyjnych oprogramowania (wstecz, głównych itp.).

Producenci urządzeń, którzy tworzą urządzenia z klawiszami nawigacji sprzętowej i chcą zaimplementować tę funkcję, będą musieli zaprojektować i wdrożyć własne elementy interfejsu systemu lub wyłączyć tę funkcję. Zalecamy, aby każda wprowadzona powierzchnia była łatwa w użyciu, gdy urządzenie jest trzymane pod kątem 90° lub 180° w stosunku do bieżącego systemu obrotu, oraz aby była szybko dostępna. Z tych powodów nie zalecamy używania powiadomień (jak w przypadku selektora IME/klawiatury).

Wymagania sprzętowe dotyczące korzystania z tej funkcji są takie same jak wymagania dotyczące korzystania z automatycznego obracania.

Aby zapewnić spójność implementacji, należy zresetować preferencje użytkownika dotyczące obracania (Settings.System.USER_ROTATION) do naturalnego ustawienia urządzenia, gdy system zmieni je z jakiegokolwiek powodu, gdy autorotacja jest wyłączona. Zaimplementowano to w ramach udostępnionej implementacji (zob. NavigationBarFragment.mRotationWatcher).

W sekcji StatusBarManager.disable2 znajduje się nowa flaga, która tymczasowo uniemożliwia wyświetlanie sugestii dotyczących rotacji. Zobacz StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS. Ten parametr musi być uwzględniany we wszystkich implementacjach, ponieważ jest używany przez niezbędne aplikacje systemowe, w tym przez Kreatora konfiguracji. Udostępniona implementacja obsługuje to (patrz: NavigationBarFragment.disable()).

Zdecydowanie zalecamy włączenie tej funkcji i stosowanie się do implementacji AOSP, jeśli to możliwe. Chcemy, aby funkcja obracania była podobna na różnych urządzeniach, co pozwoli na zachowanie spójności między automatycznym obracaniem a blokowaniem orientacji pionowej na większości telefonów.

Dostosowywanie

Sugestie dotyczące rotacji pojawiają się tylko w trybie blokady rotacji (automatyczna rotacja jest wyłączona), więc w przypadku nowych instalacji możesz wybrać, czy funkcja ma być domyślnie włączona, czy wyłączona. Aby wprowadzić zmiany domyślne, otwórz def_accelerometer_rotation w SettingsProvider/res/values/defaults.xml.

Użytkownicy mogą łatwo włączać i wyłączać autoobracanie (niezależnie od ustawień domyślnych) za pomocą kafelka obracania w Ustawieniach Szybkich lub Ustawieniach wyświetlacza.

Weryfikacja

Na potrzeby testowania można wyłączyć i włączyć tę funkcję, zmieniając wartość parametru Settings.Secure. Najłatwiej jest to zrobić, uruchamiając to polecenie w uprzywilejowanym procesie adb:

adb shell settings put secure show_rotation_suggestions <x>

Ustaw x na 0, aby wyłączyć funkcję, i na 1, aby ją włączyć.

W celu przetestowania można zresetować tryb wprowadzający, zmieniając powiązaną wartość Settings.Secure. Najłatwiej jest to zrobić, uruchamiając to polecenie w uprzywilejowanym procesie adb:

adb shell settings put secure num_rotation_suggestions_accepted 0