Tryb okien na pulpicie umożliwia użytkownikom korzystanie z wielu aplikacji jednocześnie w oknach aplikacji o zmienianym rozmiarze, co zapewnia wszechstronność i wygodę podobną do pracy na komputerze.
Na rysunku 1 widać organizację ekranu z włączonymi oknami na komputerze. Warto wiedzieć:
- Użytkownicy mogą uruchamiać kilka aplikacji obok siebie jednocześnie.
- Pasek aplikacji jest umieszczony na stałe u dołu wyświetlacza i pokazuje uruchomione aplikacje. Użytkownicy mogą przypinać aplikacje, aby mieć do nich szybki dostęp.
- Nowy, konfigurowalny pasek nagłówka zdobi górę każdego okna i zawiera elementy sterujące, takie jak minimalizowanie i maksymalizowanie.
Domyślnie aplikacje na tabletach z Androidem otwierają się na pełnym ekranie. Aby uruchomić aplikację w trybie okien na komputerze, naciśnij i przytrzymaj uchwyt okna u góry ekranu i przeciągnij go w interfejsie, jak pokazano na ilustracji 2.
Gdy aplikacja jest otwarta w trybie okien na pulpicie, inne aplikacje również otwierają się w oknach na pulpicie.
Użytkownicy mogą też wywołać okna na pulpicie z menu, które pojawia się pod uchwytem okna po kliknięciu lub dotknięciu uchwytu, albo za pomocą skrótu klawiszowego klawisz Meta (Windows, Command lub Wyszukaj) + Ctrl + strzałka w dół.
Aby wyjść z trybu okien na pulpicie, użytkownicy zamykają wszystkie aktywne okna lub chwytają uchwyt okna u góry okna pulpitu i przeciągają aplikację na górę ekranu. Skrót klawiszowy Meta + H również wyłącza tryb okien na komputerze i ponownie uruchamia aplikacje w trybie pełnoekranowym.
Aby wrócić do okien na komputerze, kliknij lub naciśnij kafelek przestrzeni na komputerze na ekranie Ostatnie.
Zmiana rozmiaru i tryb zgodności
W przypadku okien na komputerze aplikacje z zablokowaną orientacją można dowolnie zmieniać. Oznacza to, że nawet jeśli aktywność jest zablokowana w orientacji pionowej, użytkownicy mogą zmienić rozmiar aplikacji na okno w orientacji poziomej.
Aplikacje zadeklarowane jako niemożliwe do zmiany rozmiaru (czyli resizeableActivity = false) mają interfejs skalowany przy zachowaniu tego samego współczynnika proporcji.
Aplikacje aparatu, które blokują orientację lub są zadeklarowane jako niemożliwe do zmiany rozmiaru, mają specjalne traktowanie wizjerów: okno można w pełni zmieniać, ale wizjer zachowuje ten sam współczynnik proporcji. Zakładając, że aplikacje zawsze działają w orientacji pionowej lub poziomej, programiści na stałe kodują lub w inny sposób przyjmują założenia, które prowadzą do błędnych obliczeń orientacji lub proporcji podglądu lub przechwyconego obrazu, co skutkuje rozciągniętymi, odwróconymi lub obróconymi obrazami.
Dopóki aplikacje nie będą w pełni obsługiwać elastycznych wizjerów, specjalne traktowanie zapewni bardziej podstawową obsługę, która złagodzi skutki błędnych założeń.
Więcej informacji o trybie zgodności w przypadku aplikacji aparatu znajdziesz w artykule Tryb zgodności urządzenia.
Dostosowywane wcięcia nagłówka
Wszystkie aplikacje działające w oknach na komputerze mają pasek nagłówka, nawet w trybie pełnoekranowym.
Sprawdź, czy pasek nagłówka nie zasłania treści aplikacji.
Pasek nagłówka to typ paska tytułu:
WindowInsets.Companion.captionBar();
w widokach WindowInsets.Type.captionBar(),
który jest częścią pasków systemowych.
Więcej informacji o obsłudze wcięć znajdziesz w artykule Wyświetlanie treści od krawędzi do krawędzi w aplikacji i obsługa wcięć okna w Compose.
Pasek nagłówka można też dostosować. W Androidzie 15 wprowadzono typ wyglądu
APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND, aby pasek nagłówka był przezroczysty i umożliwiał aplikacjom rysowanie w nim niestandardowych treści.
Aplikacje są wtedy odpowiedzialne za stylizowanie górnej części treści, aby wyglądała jak pasek tytułu (tło, niestandardowa zawartość itp.), z wyjątkiem elementów paska tytułu systemu (przyciski zamykania i maksymalizacji), które są rysowane przez system na przezroczystym pasku tytułu nad aplikacją.
Aplikacje mogą przełączać wygląd elementów systemu w napisach w przypadku motywów jasnych i ciemnych za pomocą APPEARANCE_LIGHT_CAPTION_BARS, podobnie jak w przypadku paska stanu i paska nawigacyjnego.
W Androidzie 15 wprowadzono też metodę WindowInsets#getBoundingRects(), która umożliwia aplikacjom bardziej szczegółowe sprawdzanie wcięć paska tytułu. Aplikacje mogą rozróżniać obszary, w których system rysuje elementy systemowe, oraz niewykorzystane obszary, w których aplikacje mogą umieszczać treści niestandardowe bez nakładania się na elementy systemowe.
Lista Rect
obiektów zwracanych przez interfejs API wskazuje regiony systemu, których
należy unikać. Pozostała przestrzeń (obliczona przez odjęcie prostokątów od wstawień paska tytułu) to miejsce, w którym aplikacja może rysować bez nakładania się na elementy systemu i z możliwością odbierania danych wejściowych.
Aby ustawić prostokąty wykluczenia gestów systemowych dla niestandardowego nagłówka, w widoku lub komponencie implementuj te elementy:
// In a custom View's onLayout or a similar lifecycle method
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
if (changed) {
// Calculate the height of your custom header
val customHeaderHeight = 100 // Replace with your actual header height in pixels
// Create a Rect covering your custom header area
val exclusionRect = Rect(0, 0, width, customHeaderHeight)
// Set the exclusion rects for the system
systemGestureExclusionRects = listOf(exclusionRect)
}
}
Wielozadaniowość i obsługa wielu instancji
Wielozadaniowość jest podstawą okien na komputerach, a umożliwienie korzystania z wielu instancji aplikacji może znacznie zwiększyć produktywność użytkowników.
W Androidzie 15 wprowadzono PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI, które aplikacje mogą ustawiać, aby określić, że interfejs systemu powinien być wyświetlany w przypadku aplikacji, aby umożliwić jej uruchamianie w wielu instancjach.
Możesz zadeklarować PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI w AndroidManifest.xml aplikacji w tagu <activity>:
<activity
android:name=".MyActivity"
android:exported="true"
android:resizeableActivity="true">
<meta-data
android:name="android.window.PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI"
android:value="true" />
</activity>
Zarządzanie instancjami aplikacji za pomocą gestów przeciągania
W trybie wielu okien użytkownicy mogą uruchomić nową instancję aplikacji, przeciągając element widoku z okna aplikacji. Użytkownicy mogą też przenosić elementy między instancjami tej samej aplikacji.
Android 15 wprowadza 2 flagi, które umożliwiają dostosowanie działania przeciągania:
DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG: oznacza, że nieobsługiwane przeciąganie powinno zostać przekazane do systemu, aby rozpocząć je, jeśli żadne widoczne okno nie obsługuje upuszczania. Gdy używasz tej flagi, wywołujący musi podaćClipDatazClipData.Item, który zawiera niezmiennyIntentSenderdo aktywności, która ma zostać uruchomiona (patrzClipData.Item.Builder#setIntentSender()). System może uruchomić intencję lub nie, w zależności od takich czynników jak bieżący rozmiar ekranu lub tryb okienkowy. Jeśli system nie uruchomi intencji, zostanie ona anulowana w ramach normalnego procesu przeciągania.DRAG_FLAG_GLOBAL_SAME_APPLICATION: Wskazuje, że operacja przeciągania może przekraczać granice okien (w przypadku wielu instancji tej samej aplikacji).Gdy funkcja [
startDragAndDrop()][20] jest wywoływana z ustawioną tą flagą, tylko widoczne okna należące do tej samej aplikacji mogą uczestniczyć w operacji przeciągania i otrzymywać przeciąganą zawartość.
Poniższy przykład pokazuje, jak używać tych flag z funkcją startDragAndDrop():
// Assuming 'view' is the View that initiates the drag
view.setOnLongClickListener {
// Create an IntentSender for the activity you want to launch
val launchIntent = Intent(view.context, NewInstanceActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
view.context,
0,
launchIntent,
PendingIntent.FLAG_IMMUTABLE // Ensure the PendingIntent is immutable
)
// Build the ClipData.Item with the IntentSender
val item = ClipData.Item.Builder()
.setIntentSender(pendingIntent.intentSender)
.build()
// Create ClipData with a simple description and the item
val dragData = ClipData(
ClipDescription("New Instance Drag", arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN)),
item
)
// Combine the drag flags
val dragFlags = View.DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG or
View.DRAG_FLAG_GLOBAL_SAME_APPLICATION
// Start the drag operation
view.startDragAndDrop(
dragData, // The ClipData to drag
View.DragShadowBuilder(view), // A visual representation of the dragged item
null, // Local state object (not used here)
dragFlags // The drag flags
)
true // Indicate that the long click was consumed
}
Dodatkowe optymalizacje
Dostosuj uruchamianie aplikacji i przełączaj je z trybu okien na komputerze na pełny ekran.
Określanie domyślnego rozmiaru i położenia
Nie wszystkie aplikacje, nawet te, których rozmiar można zmieniać, potrzebują dużego okna, aby oferować użytkownikom wartość.
Za pomocą metody ActivityOptions#setLaunchBounds() możesz określić domyślny rozmiar i pozycję, gdy aktywność jest uruchamiana.
Oto przykład ustawiania zakresów uruchamiania aktywności:
val options = ActivityOptions.makeBasic()
// Define the desired launch bounds (left, top, right, bottom in pixels)
val launchBounds = Rect(100, 100, 700, 600) // Example: 600x500 window at (100,100)
// Apply the launch bounds to the ActivityOptions
options.setLaunchBounds(launchBounds)
// Start the activity with the specified options
val intent = Intent(this, MyActivity::class.java)
startActivity(intent, options.toBundle())
Włączanie trybu pełnoekranowego z przestrzeni na pulpicie
Aplikacje mogą przejść w tryb pełnoekranowy, wywołując funkcję Activity#requestFullScreenMode().
Ta metoda wyświetla aplikację na pełnym ekranie bezpośrednio z trybu okien na komputerze.
Aby poprosić o tryb pełnoekranowy z poziomu aktywności, użyj tego kodu:
// In an Activity
fun enterFullScreen() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // Android 15 (U)
requestFullScreenMode()
}
}