ChromeOS obsługuje aplikacje na Androida w wielu oknach. System renderuje aplikacje w kontenerach okien, których rozmiar zależy od typu urządzenia, jak pokazano na rysunku 1.
Rysunek 1. Okno aplikacji na różnych urządzeniach.
Ważne jest, aby projektować układy, które działają na ekranach o różnych rozmiarach. Jeśli postępujesz zgodnie z wytycznymi Androida dotyczącymi obsługi różnych rozmiarów ekranu, Twoja aplikacja będzie dobrze działać również w ChromeOS.
Na tej stronie dowiesz się, jak zapewnić prawidłowe uruchamianie okna aplikacji, płynną zmianę jego rozmiaru i wyświetlanie całej zawartości po zmianie rozmiaru.
Rozmiar początkowy po uruchomieniu
Aplikacje mogą prosić o początkowy rozmiar uruchomienia w ten sposób:
Rozmiar początkowy może być używany tylko w środowiskach na komputery. Dzięki temu menedżer okien może określić prawidłowe granice i orientację. Aby wskazać preferencje w trybie na komputery, dodaj te metatagi w sekcji
<activity>:<meta-data android:name="WindowManagerPreference:FreeformWindowSize" android:value="[phone|tablet|maximize]" /> <meta-data android:name="WindowManagerPreference:FreeformWindowOrientation" android:value="[portrait|landscape]" />Używaj statycznych granic uruchamiania. Użyj
<layout>w pozycji manifestu aktywności, aby określić „stały” rozmiar początkowy, jak w tym przykładzie:<layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" android:minHeight="450dp" android:minWidth="300dp" />Używaj dynamicznych granic uruchamiania. Podczas tworzenia nowej aktywności może ona tworzyć i używać
ActivityOptions.setLaunchBounds(Rect). Określając pusty prostokąt, możesz zmaksymalizować rozmiar aplikacji.
Zmiana rozmiaru okien
W ChromeOS użytkownicy mogą zmieniać rozmiar okna aplikacji w zwykły sposób: przeciągając prawy dolny róg, jak pokazano na rysunku 2.
Rysunek 2. okno aplikacji, którego rozmiar można zmieniać;
Podczas korzystania z klasy View dostępne są 2 opcje obsługi zmiany rozmiaru okna:
- Dynamiczne reagowanie na zmiany konfiguracji przez wywoływanie
onConfigurationChanged(..). Możesz na przykład dodaćandroid:configChanges="screenSize|smallestScreenSize|orientation|screenLayout"do pliku manifestu aktywności. Więcej informacji o obsłudze zmian konfiguracji znajdziesz w artykule Obsługa zmian konfiguracji. - Zezwól na ponowne uruchomienie aktywności. W takim przypadku zaimplementuj
onSaveInstanceStatei użyj komponentu architektury ViewModel, aby przywrócić poprzedni zapisany stan.
W przypadku korzystania z Jetpack Compose zmiana rozmiaru zależy od konfiguracji aktywności. Jeśli obsługuje zmiany dynamicznie, po zmianie rozmiaru okna następuje ponowne komponowanie. Jeśli aktywność zostanie ponownie uruchomiona przez system, po ponownym uruchomieniu nastąpi początkowa kompozycja. W każdym przypadku ważne jest tworzenie układów Compose, które dostosowują się do zmieniających się rozmiarów okna. Nie zakładaj stałych rozmiarów.
Wymiary okna
sprawdzanie przez aktywności wymiarów okna przy każdym uruchomieniu i dostosowywanie zawartości do bieżącej konfiguracji;
Aby określić bieżącą konfigurację, wywołaj getResources().getConfiguration()w bieżącej aktywności. Nie używaj konfiguracji aktywności w tle ani zasobów systemowych.
Aktywność w tle nie ma rozmiaru, a konfiguracja systemu może zawierać wiele okien o sprzecznych rozmiarach i orientacjach, więc nie można wyodrębnić żadnych przydatnych danych.
Pamiętaj, że rozmiar okna i rozmiar ekranu to nie to samo. Aby uzyskać rozmiar okna w DP, użyj Activity.getResources().getConfiguration().screenWidth i Activity.getResources().getConfiguration().screenHeight. Prawdopodobnie nigdy nie będziesz musiał(-a) używać rozmiaru ekranu.
Granice treści
Granice zawartości okna mogą się zmienić po zmianie rozmiaru. Na przykład obszar w oknie używany przez aplikację może się zmienić, jeśli okno stanie się zbyt duże, aby zmieścić się na ekranie. Postępuj zgodnie z tymi wytycznymi:
- Aplikacje, które korzystają z procesu układu Androida, są automatycznie rozmieszczane w dostępnej przestrzeni.
Aplikacje natywne muszą odczytywać dostępny obszar i monitorować zmiany rozmiaru, aby uniknąć niedostępnych elementów interfejsu. Aby określić początkowy dostępny rozmiar tej powierzchni, wywołaj te metody:
NativeActivity.mLastContent[X/Y/Width/Height]()findViewById(android.R.id.content).get[Width/Height]()
Ciągłe monitorowanie można przeprowadzać za pomocą obserwatora:
NativeActivity.onContentRectChangedNative()NativeActivity.onGlobalLayout()- Dodawanie słuchacza do zasobu
view.addOnLayoutChangeListener(findViewById(android.R.id.content))
Jeśli aplikacja wstępnie skaluje grafikę, rób to za każdym razem, gdy zmienia się rozdzielczość.
Swobodna zmiana rozmiaru
ChromeOS umożliwia dowolną zmianę rozmiaru okna: użytkownik może zmienić jego szerokość, wysokość i położenie na ekranie. Wiele aplikacji na Androida jest pisanych bez uwzględnienia możliwości dowolnej zmiany rozmiaru. Zwróć uwagę na te kwestie:
- Położenie ekranu może się zmienić. Zawsze używaj systemu do przekształcania współrzędnych okna na ekran i ekranu na okno.
- Jeśli używasz systemu widoków Androida, układ okna automatycznie zmienia się, gdy zmienia się jego rozmiar.
- Jeśli nie korzystasz z systemu widoku i przejmujesz powierzchnię, aplikacja musi samodzielnie obsługiwać zmiany rozmiaru.
- W przypadku aplikacji natywnych używaj elementów
mLastContentlub widoku treści, aby określić początkowy rozmiar. - Gdy aplikacja jest uruchomiona, nasłuchuj zdarzeń
onContentRectChangedNativelubonGlobalLayout, aby reagować na zmiany rozmiaru. - Gdy rozmiar aplikacji się zmieni, zmień skalę lub ponownie wczytaj układy i grafikę oraz zaktualizuj obszary wprowadzania.
Tryb pełnoekranowy
Tryb pełnoekranowy działa tak samo jak na standardowym Androidzie. Jeśli okno nie zajmuje całego ekranu, żądania wyświetlania na pełnym ekranie (ukrywania wszystkich elementów interfejsu systemu) są ignorowane. Gdy aplikacja jest zmaksymalizowana, wykonywane są normalne metody, układy i funkcje pełnoekranowe. Ukrywa to elementy interfejsu systemu (pasek sterowania oknem i półkę).
Orientacja ekranu
Najczęstszą orientacją aplikacji na Androida jest orientacja pionowa, ponieważ w ten sposób trzyma się większość telefonów. Tryb pionowy jest dobry na telefonach, ale nie sprawdza się na laptopach i tabletach, na których preferowany jest tryb poziomy. Aby uzyskać najlepsze wyniki w przypadku aplikacji, warto obsługiwać oba tryby.
Niektóre aplikacje na Androida zakładają, że gdy urządzenie jest trzymane w orientacji pionowej, wartość obrotu wynosi Surface.ROTATION_0.
Może to dotyczyć większości urządzeń z Androidem. Gdy jednak aplikacja jest w określonym trybie ARC, wartość obrotu w przypadku orientacji pionowej może nie wynosić Surface.ROTATION_0.
Aby uzyskać dokładną wartość rotacji podczas odczytywania danych z akcelerometru lub podobnych czujników, użyj metody Display.getRotation() i odpowiednio zamień osie.
główne działanie i orientacja;
Okno Chromebooka składa się ze stosu okien aktywności. Każde okno w stosie ma ten sam rozmiar i orientację.
Nagłe zmiany orientacji i rozmiaru są mylące w środowisku komputerowym. Menedżer okien Chromebooka unika tego problemu w sposób podobny do trybu obok siebie na Androidzie: aktywność na dole stosu kontroluje atrybuty wszystkich aktywności powyżej niej. Może to prowadzić do nieoczekiwanych sytuacji, w których nowo rozpoczęta aktywność w trybie pionowym i o stałym rozmiarze przechodzi w tryb poziomy i zmienia rozmiar.
Tryb urządzenia ma tu znaczenie: w trybie tabletu orientacja nie jest zablokowana, a każde okno zachowuje własną orientację, tak jak to zwykle ma miejsce na Androidzie.
Wytyczne dotyczące orientacji
Postępuj zgodnie z tymi wytycznymi dotyczącymi orientacji:
- Jeśli obsługujesz tylko jedną orientację, dodaj informacje do pliku manifestu, aby menedżer okien znał je przed uruchomieniem aplikacji. Gdy określasz orientację, w miarę możliwości podaj też orientację czujnika. Chromebooki często są urządzeniami konwertowalnymi, a aplikacja wyświetlana do góry nogami pogarsza wrażenia użytkownika.
- Staraj się trzymać wybranej orientacji. Unikaj proszenia o jeden rodzaj orientacji w pliku manifestu i późniejszego ustawiania innego rodzaju orientacji za pomocą kodu.
- Zachowaj ostrożność przy zmianie orientacji w zależności od rozmiaru okna. Użytkownik może utknąć w małym oknie w orientacji pionowej i nie będzie mógł wrócić do większego okna w orientacji poziomej.
- W Chrome są dostępne elementy sterujące oknem, które umożliwiają przełączanie się między wszystkimi dostępnymi układami. Wybierając odpowiednią opcję orientacji, możesz mieć pewność, że po uruchomieniu aplikacji użytkownik będzie miał prawidłowy układ. Jeśli aplikacja jest dostępna w orientacji pionowej i poziomej, w miarę możliwości ustaw domyślnie orientację poziomą. Po ustawieniu tej opcji jest ona zapamiętywana dla każdej aplikacji z osobna.
- Staraj się unikać niepotrzebnych zmian orientacji. Jeśli na przykład orientacja aktywności jest pionowa, ale aplikacja wywołuje
setRequestedOrientation(LANDSCAPE)w czasie działania, powoduje to niepotrzebną zmianę rozmiaru okna, co jest irytujące dla użytkownika i może spowodować ponowne uruchomienie aplikacji, jeśli nie może ona sobie z tym poradzić. Lepiej ustawić orientację tylko raz, np. w pliku manifestu, i zmieniać ją tylko w razie potrzeby.
Inne uwagi
Oto kilka innych kwestii, które warto wziąć pod uwagę podczas korzystania z aplikacji na Androida w ChromeOS:
- Nie wywołuj funkcji
finish()w metodzieonDestroyaktywności. Spowoduje to zamknięcie aplikacji po zmianie rozmiaru i brak możliwości ponownego uruchomienia. - Nie używaj niezgodnych typów okien, takich jak
TYPE_KEYGUARDiTYPE_APPLICATION_MEDIA. - Szybkie ponowne uruchamianie aktywności dzięki buforowaniu obiektów, które zostały wcześniej przydzielone.
- Jeśli nie chcesz, aby użytkownik mógł zmieniać rozmiar aplikacji, w pliku manifestu określ
android:resizeableActivity=false. - Przetestuj aplikację, aby upewnić się, że prawidłowo reaguje na zmiany rozmiaru okna.