Zarządzanie oknami

ChromeOS obsługuje aplikacje na Androida w wielu oknach. System renderuje aplikacje w kontenerach okiennych, których rozmiar jest określany przez format urządzenia, jak pokazano na ilustracji 1.

Rysunek 1. Okno aplikacji na różnych urządzeniach.

Ważne jest, aby projektować układy dostosowane do ekranów o różnych rozmiarach. Jeśli postępujesz zgodnie ze wskazówkami dotyczącymi obsługi różnych rozmiarów ekranu na Androidzie, Twoja aplikacja będzie dobrze działać również w ChromeOS.

Na tej stronie dowiesz się, jak sprawdzić, czy okno aplikacji wyświetla się prawidłowo, płynnie zmienia rozmiar i wyświetla całą zawartość, gdy zmieni się jej rozmiar.

Rozmiar początkowy do wprowadzenia na rynek

Aplikacje mogą prosić o wstępny rozmiar kampanii, korzystając z tych sposobów:

  • Rozmiar uruchamiania używaj tylko w środowiskach komputerowych. Pomoże to menedżerowi okien określić odpowiednie granice i orientację. Aby wskazać ustawienia używane w trybie pulpitu, dodaj w obiekcie <activity> te metatagi:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • Użyj statycznych granic uruchamiania. Użyj <layout> w wpisie o aktywności w pliku manifestu, 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żyj dynamicznych granic uruchamiania. Działanie może zostać utworzone i wykorzystane ActivityOptions.setLaunchBounds(Rect) podczas tworzenia nowej aktywności. Jeśli określisz pusty prostokąt, możesz zmaksymalizować możliwości aplikacji.

Zmiana rozmiaru okien

W ChromeOS użytkownicy mogą zmienić rozmiar okna aplikacji w zwykły sposób – przeciągając prawy dolny róg, jak pokazano na ilustracji 2.

Rysunek 2. Okno aplikacji z możliwością zmiany rozmiaru.

Są 2 opcje zmiany rozmiaru okien przy użyciu klasy View:

  • Dynamicznie reaguj na zmiany konfiguracji, wywołując metodę onConfigurationChanged(..). Na przykład możesz dodać do pliku manifestu aktywności element android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout". Więcej informacji o postępowaniu ze zmianami konfiguracji znajdziesz w artykule Obsługa zmian konfiguracji.
  • Pozwól systemowi ponownie uruchomić aktywność. W tym przypadku zaimplementuj onSaveInstanceState i 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 ona zmiany dynamicznie, następuje zmiana kompozycji w przypadku zmiany rozmiaru okna. Jeśli działanie zostanie wznowione przez system, po ponownym uruchomieniu zostanie utworzona początkowa kompozycja. Niezależnie od tego, co się dzieje, ważne jest tworzenie układów tworzenia wiadomości, które dostosowują się do zmieniających się rozmiarów okien. Nie zakładaj stałych rozmiarów.

Wymiary okna

Zadbaj o to, aby działania odczytywały wymiary okien przy każdym uruchomieniu i układały ich zawartość zgodnie z bieżącą konfiguracją.

Aby określić bieżącą konfigurację, wywołaj getResources().getConfiguration() w przypadku bieżącego działania. Nie używaj konfiguracji aktywności w tle ani zasobu systemowego. Aktywność w tle nie ma określonego rozmiaru, a konfiguracja systemu może zawierać wiele okien o sprzecznych rozmiarach i orientacjach, dlatego nie można wyodrębnić żadnych użytecznych danych.

Pamiętaj, że rozmiar okna i ekranu to nie to samo. Aby uzyskać rozmiar okna w DP, użyj Activity.getResources().getConfiguration().screenWidth i Activity.getResources().getConfiguration().screenHeight. Rozmiar ekranu prawdopodobnie nie jest potrzebny.

Zakres treści

Po zmianie rozmiaru granice okna z zawartością okna mogą się zmienić. Na przykład obszar w oknie używany przez aplikację może się zmienić, gdy okno staje się zbyt duże i nie mieści się na ekranie. Postępuj zgodnie z tymi wytycznymi:

  • Aplikacje, które korzystają z procesu układu Androida, są automatycznie układane w dostępnym miejscu.
  • Aplikacje natywne muszą odczytywać dostępny obszar i monitorować zmiany rozmiaru, aby uniknąć dostępności niedostępnych elementów interfejsu. Wywołaj te metody, aby określić początkowy dostępny rozmiar tej powierzchni:

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    Stałe monitorowanie można prowadzić z pomocą obserwatora:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • Dodaj detektor do: view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    Jeśli aplikacja wstępnie skaluje grafikę, należy to robić przy każdej zmianie rozdzielczości.

Swobodna zmiana rozmiaru

ChromeOS umożliwia swobodną zmianę rozmiaru dowolnego okna: użytkownik może zmieniać szerokość, wysokość i położenie okna na ekranie. Wiele aplikacji na Androida jest napisanych bez konieczności swobodnego zmiany rozmiaru. Weź pod uwagę te kwestie:

  • Pozycja ekranu może się zmienić. Zawsze używaj systemu do przekształcania współrzędnych „okno na ekran” i „ekran po okno”.
  • Jeśli korzystasz z systemu widoku na Androidzie, układ okna zmienia się automatycznie po zmianie rozmiaru.
  • Jeśli nie używasz systemu widoku i przejmujesz kontrolę nad powierzchnią, Twoja aplikacja musi samodzielnie obsługiwać zmianę rozmiaru.
  • W przypadku aplikacji natywnych określ rozmiar początkowy, korzystając z użytkowników mLastContent lub z widoku treści.
  • Gdy aplikacja jest uruchomiona, nasłuchuj zdarzeń onContentRectChangedNative lub onGlobalLayout, aby reagować na zmiany rozmiaru.
  • Gdy rozmiar aplikacji się zmieni, przeskaluj lub wczytaj ponownie układy i grafikę oraz zaktualizuj obszary wejściowe.

Tryb pełnoekranowy

Tryb pełnoekranowy działa tak samo jak na standardowym Androidzie. Jeśli okno nie zasłania pełnego ekranu, żądania pełnego sprawdzenia (ukrycia wszystkich elementów interfejsu systemu) są ignorowane. Gdy aplikacja jest zmaksymalizowana, działają zwykłe metody pełnoekranowe, układy i funkcje. Spowoduje to ukrycie elementów interfejsu systemowego (paska sterowania oknem i półki).

Orientacja ekranu

Aplikacja na Androida ma najczęściej orientację pionową, ponieważ w ten sposób trzyma się w niej większość telefonów. Orientacja pionowa sprawdza się w przypadku telefonów, ale robi złe wrażenie na laptopach i tabletach, ponieważ preferuje orientację poziomą. Aby uzyskać najlepsze rezultaty w przypadku aplikacji, rozważ obsługę obu orientacji.

Niektóre aplikacje na Androida zakładają, że gdy urządzenie jest trzymane pionowo, wartość obrotu wynosi Surface.ROTATION_0. Może to dotyczyć większości urządzeń z Androidem. Jednak gdy aplikacja działa w określonym trybie ARC, wartość obrotu dla orientacji pionowej może nie wynosić Surface.ROTATION_0.

Aby uzyskać dokładną wartość obrotu podczas odczytu akcelerometru lub podobnych czujników, użyj metody Display.getRotation() i odpowiednio zamień oś.

aktywność na poziomie głównym i jego orientacja,

Okno Chromebooka składa się ze stosu okien aktywności. Każde okno w stosie ma taką samą wielkość i orientację.

Nagłe zmiany orientacji i rozmiaru mogą wprowadzać w błąd w środowisku stacjonarnym. Menedżer okien Chromebooka unika tego w sposób podobny do działania trybu równoległego na Androidzie: aktywność na dole stosu kontroluje atrybuty wszystkich działań znajdujących się nad nim. Może to prowadzić do niespodziewanych sytuacji, w których nowo rozpoczęta aktywność w orientacji pionowej, której nie można zmienić, staje się pionowa i możliwa do zmiany rozmiaru.

Tryb urządzenia ma tu efekt: w trybie tabletu orientacja nie jest zablokowana i każde okno zachowuje swoją własną orientację, tak jak zwykle na Androidzie.

Wytyczne dotyczące orientacji

Postępuj zgodnie z tymi wskazówkami dotyczącymi obsługi orientacji:

  • Jeśli obsługujesz tylko jedną orientację, dodaj informacje do pliku manifestu, aby menedżer okien wiedział o niej przed uruchomieniem aplikacji. Podczas określania orientacji musisz też w miarę możliwości określić orientacje czujników. Chromebooki często są konwertowalne, a aplikacja obrócona do góry nogami niekorzystnie wpływa na wygodę użytkowników.
  • Spróbuj pozostać przy jednej wybranej orientacji. Unikaj żądania jednej orientacji w pliku manifestu i późniejszego ustawiania innej w sposób zautomatyzowany.
  • Pamiętaj, aby zmieniać orientację w zależności od rozmiaru okna. Użytkownik może utknąć w małym oknie w orientacji pionowej i nie mieć możliwości powrotu do większego okna w orientacji poziomej.
  • W Chrome są elementy sterujące oknami, które pozwalają przełączać się między wszystkimi dostępnymi układami. Wybierając odpowiednią opcję orientacji, masz pewność, że użytkownik będzie miał właściwy układ po uruchomieniu aplikacji. Jeśli aplikacja jest dostępna w orientacji pionowej i poziomej, w miarę możliwości wybierz domyślnie orientację poziomą. Po skonfigurowaniu tej opcji jest ona zapamiętywana dla każdej aplikacji.
  • 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 niepotrzebne zmienianie rozmiaru okna, co jest irytujące dla użytkownika i może ponownie uruchomić aplikację, w przypadku której aplikacja nie jest w stanie jej obsłużyć. Najlepiej ustawić orientację raz, na przykład w pliku manifestu, i zmienić ją tylko w razie potrzeby.

Inne rzeczy, które warto wziąć pod uwagę

Oto kilka innych kwestii, które warto wziąć pod uwagę podczas pracy z aplikacjami na Androida w ChromeOS:

  • Nie wywołujej funkcji finish() w metodzie onDestroy aktywności. Aplikacja zamyka się po zmianie rozmiaru i nie uruchamia ponownie.
  • Nie używaj niezgodnych typów okien, np. TYPE_KEYGUARD i TYPE_APPLICATION_MEDIA.
  • Szybkie ponowne uruchomienie aktywności dzięki buforowaniu obiektów, które zostały wcześniej przydzielone.
  • Jeśli nie chcesz, aby użytkownik zmieniał rozmiar aplikacji, w pliku manifestu wpisz android:resizeableActivity=false.
  • Przetestuj aplikację, aby upewnić się, że prawidłowo obsługuje zmiany rozmiaru okna.