Unterstützung großer Bildschirmgrößen

Wenn Sie Ihr Spiel nicht nur für Smartphones, sondern auch für andere Formfaktoren mit großem Display anbieten, müssen Sie berücksichtigen, wie Ihr Spiel die Fensterverwaltung handhabt. Auf Googlebook, ChromeOS und Google Play Games auf dem PC kann Ihr Spiel in einem Fenstermodus über einer Hauptoberfläche ausgeführt werden. Auf neuen Android-Tablets und Foldables mit Android 12L (API-Level 32) oder höher und einer Bildschirmbreite von mehr als 600 dp kann Ihr Spiel im Splitscreen-Modus neben anderen Anwendungen ausgeführt werden. Es kann auch die Größe geändert und auf Foldables zwischen dem inneren und äußeren Display verschoben werden. Dadurch ändert sich die Konfiguration für die Fenstergröße und auf einigen Geräten auch die Ausrichtung.

Größenanpassung bei Unity-Spielen

Grundlegende Konfiguration für große Bildschirme

Geben Sie an, ob Ihr Spiel die Größenänderung unterstützt:

<android:resizeableActivity="true" or "false" />

Wenn die Größe nicht angepasst werden kann, müssen im Spielmanifest die unterstützten Mindest- und Höchstseitenverhältnisse explizit definiert werden:

<!-- Render full screen between 3:2 and 21:9 aspect ratio -->
<!-- Let the platform letterbox otherwise -->
<activity android:minAspectRatio="1.5">
<activity android:maxAspectRatio="2.33">

Google Play Games auf dem PC

Bei Google Play Games auf dem PC wird die Fenstergröße von der Plattform angepasst, wobei das angegebene Seitenverhältnis beibehalten wird. Die Fenstergröße wird automatisch an die optimalen Abmessungen angepasst. Wenn Ihr Spiel hauptsächlich im Querformat ausgerichtet ist, müssen Sie mindestens das Seitenverhältnis 16:9 unterstützen. Wenn es hauptsächlich im Hochformat ausgerichtet ist, müssen Sie mindestens das Seitenverhältnis 9:16 unterstützen. Für ein optimales Spielerlebnis sollten Sie die Seitenverhältnisse 21:9, 16:10 und 3:2 für ein Spiel im Querformat explizit unterstützen. Die Anpassung der Fenstergröße ist hier nicht erforderlich, aber für die Kompatibilität mit anderen Formfaktoren ist es trotzdem gut, sie zu haben.

Weitere Informationen und Best Practices finden Sie unter Grafik für Google Play Games auf dem PC konfigurieren.

Großes Display

Um den sichtbaren Bereich für Ihr Spiel im Vollbildmodus auf Tablets mit großem Display, Faltgeräten, Chromebooks, ChromeOS und verbundenen Displays zu maximieren, unterstützen Sie den Vollbild-Immersivmodus und blenden Sie die Systemleisten aus, indem Sie Flags für decorView, die Sichtbarkeit der System-UI oder über die WindowInsetsCompat API festlegen. Außerdem sollten Sie Konfigurationsereignisse für die Drehung und Größenänderung ordnungsgemäß verarbeiten oder verhindern.

Beachten Sie, dass Ihr Spiel auf Android-Geräten mit großen Displays in Konfigurationen ausgeführt werden kann, die Sie möglicherweise noch nicht unterstützen. Wenn Ihr Spiel nicht alle Fenstergrößen und Ausrichtungskonfigurationen unterstützt, wird es in Kompatibilitätsmodus angezeigt. Falls erforderlich, wird der Spieler vor dem Wechsel zu einer nicht unterstützten Konfiguration aufgefordert.

Abbildung 1. Dialogfeld zur Konfigurationskompatibilität.

Auf einigen Geräten werden Spieler, die zu einer nicht unterstützten Konfiguration wechseln, möglicherweise aufgefordert, das Spiel neu zu laden und die Aktivität neu zu erstellen, um sie an das neue Fensterlayout anzupassen. Dies kann das Spielerlebnis beeinträchtigen. Testen Sie Ihr Spiel in verschiedenen Konfigurationen des Mehrfenstermodus (2/3, 1/2, 1/3 Fenstergröße) und prüfen Sie, ob Gameplay- oder UI-Elemente abgeschnitten oder nicht zugänglich sind. Testen Sie außerdem, wie Ihr Spiel auf die Kontinuität bei Faltgeräten reagiert, wenn zwischen dem inneren und dem äußeren Display gewechselt wird. Wenn Probleme auftreten, müssen Sie diese Konfigurationsereignisse explizit behandeln und Unterstützung für die erweiterte Anpassung der Größe auf großen Bildschirmen hinzufügen.

Erweiterte Anpassbarkeit der Bildschirmgröße

Abbildung 2. Unterschiedliche Benutzeroberflächen auf dem Desktop und auf faltbaren Geräten im Tischmodus.

So beenden Sie den Kompatibilitätsmodus und vermeiden die Neuerstellung von Aktivitäten:

  1. Deklarieren Sie Ihre Hauptaktivität als resizable:

    <android:resizeableActivity="true" />
    
  2. Deklariere im Attribut android:configChanges des Elements <activity> im Manifest deines Spiels die explizite Unterstützung für „orientation“, „screenSize“, „smallestScreenSize“, „screenLayout“ und „density“, um alle Konfigurationsereignisse für große Displays zu erhalten:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. Überschreiben Sie onConfigurationChanged() und verarbeiten Sie das Konfigurationsereignis, einschließlich der aktuellen Ausrichtung, Fenstergröße, Breite und Höhe:

    Kotlin

    override fun onConfigurationChanged(newConfig: Configuration) {
       super.onConfigurationChanged(newConfig)
       val density: Float = resources.displayMetrics.density
       val newScreenWidthPixels =
    (newConfig.screenWidthDp * density).toInt()
       val newScreenHeightPixels =
    (newConfig.screenHeightDp * density).toInt()
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       val newScreenOrientation: Int = newConfig.orientation
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       val newScreenRotation: Int =
    windowManager.defaultDisplay.rotation
    }

    Java

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
       super.onConfigurationChanged(newConfig);
       float density = getResources().getDisplayMetrics().density;
       int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
       int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       int newScreenOrientation = newConfig.orientation;
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       int newScreenRotation = getWindowManager().getDefaultDisplay()
               .getRotation();
    }

Sie können auch die WindowManager abfragen, um die aktuelle Geräteausrichtung zu prüfen. Prüfen Sie anhand dieser Metadaten die neuen Fensterdimensionen und rendern Sie das Video in der vollen Fenstergröße. Das funktioniert möglicherweise nicht in allen Fällen, da sich die Seitenverhältnisse unterscheiden. Alternativ können Sie die Benutzeroberfläche des Spiels an die neue Fenstergröße anpassen und die Inhalte des Spiels mit Letterboxing versehen. Wenn es technische oder Designbeschränkungen gibt, die einen der beiden Ansätze verhindern, können Sie das Letterboxing auch selbst in der Engine vornehmen, um das Seitenverhältnis beizubehalten. Skalieren Sie das Video auf die bestmöglichen Abmessungen, deklarieren Sie resizeableActivity = false und vermeiden Sie den Konfigurationsmodus.

Unabhängig davon, welchen Ansatz Sie wählen, sollten Sie Ihr Spiel in verschiedenen Konfigurationen testen (auf- und zuklappen, verschiedene Drehungen, Split-Screen-Modus) und darauf achten, dass keine UI-Elemente im Spiel abgeschnitten werden oder sich überlappen, dass es keine Probleme mit der Barrierefreiheit von Touch-Zielen gibt und dass das Seitenverhältnis nicht dazu führt, dass das Spiel gestreckt, zusammengedrückt oder anderweitig verzerrt wird.

Außerdem sind die Pixel auf größeren Bildschirmen in der Regel größer, da die gleiche Anzahl von Pixeln auf einer viel größeren Fläche verteilt ist. Das kann zu einer Verpixelung von verkleinerten Renderpuffern oder Assets mit niedrigerer Auflösung führen. Verwenden Sie Ihre hochwertigsten Assets auf Geräten mit großem Bildschirm und optimieren Sie die Leistung Ihres Spiels, um Probleme zu vermeiden. Wenn dein Spiel mehrere Qualitätsstufen unterstützt, achte darauf, dass es für Geräte mit großen Displays optimiert ist.

Mehrfenstermodus

Im Multi-Window-Modus können mehrere Apps gleichzeitig auf demselben Bildschirm angezeigt werden. Der Mehrfenstermodus ändert den Aktivitätslebenszyklus nicht. Der Status „Wieder aufgenommen“ von Apps in mehreren Fenstern unterscheidet sich jedoch in verschiedenen Android-Versionen (siehe Aktivitätslebenszyklus im Mehrfenstermodus unter Mehrfenstermodus unterstützen).

Wenn der Nutzer eine App oder ein Spiel in den Mehrfenstermodus versetzt, benachrichtigt das System die Aktivität über eine Konfigurationsänderung, wie im Abschnitt Erweiterte Anpassung der Größe für große Displays beschrieben. Eine Konfigurationsänderung erfolgt auch, wenn der Player die Größe des Spiels ändert oder das Spiel wieder in den Vollbildmodus versetzt.

Es gibt keine Garantie dafür, dass die Anwendung den Fokus wiedererlangt, wenn sie in den Mehrfenstermodus versetzt wird. Wenn Sie also eines der App-Statusereignisse verwenden, um Ihr Spiel zu pausieren, sollten Sie sich nicht darauf verlassen, dass das Spiel durch das Ereignis zum Erhalten des Fokus (onWindowFocusChanged() mit dem Fokuswert „true“) fortgesetzt wird. Verwenden Sie stattdessen andere Event-Handler oder Handler für Zustandsänderungen wie onConfigurationChanged() oder onResume(). Mit der Methode isInMultiWindowMode() können Sie jederzeit erkennen, ob die aktuelle Aktivität im Mehrfenstermodus ausgeführt wird.

Bei der Desktop-Freiform-Fensterverwaltung auf Googlebook, ChromeOS sowie Tablets und Faltgeräten mit großem Display sind die anfänglichen Fensterabmessungen ein wichtiger Faktor. Ein Spiel muss nicht im Vollbildmodus ausgeführt werden. In diesem Fall müssen Sie die Größe des Fensters angeben. Dafür gibt es zwei empfohlene Möglichkeiten.

Bei der ersten Option werden bestimmte Attribute für das <layout>-Tag in Ihrem Android-Manifest verwendet. Mit den Attributen defaultHeight und defaultWidth werden die ursprünglichen Dimensionen festgelegt. Achten Sie auch auf die Attribute minHeight und minWidth, damit Ihre Spieler das Spielfenster nicht auf Abmessungen ändern können, die Sie nicht unterstützen. Schließlich gibt es noch das Attribut gravity, das bestimmt, wo auf dem Bildschirm das Fenster beim Starten angezeigt wird. Hier ein Beispiel für ein Layout-Tag mit diesen Attributen:

<layout android:defaultHeight="500dp"
        android:defaultWidth="600dp"
        android:gravity="top|end"
        android:minHeight="450dp"
        android:minWidth="300dp" />

Die zweite Option zum Festlegen der Fenstergröße ist die Verwendung dynamischer Startgrenzen. Mit setLaunchBounds(Rect)⁠⁠ können Sie die Startfensterdimensionen definieren. Wenn ein leeres Rechteck angegeben ist, wird die Aktivität maximiert gestartet.

Wenn Sie die Unity- oder Unreal-Game-Engines verwenden, achten Sie darauf, dass Sie eine aktuelle Version (Unity 2019.4.40 und Unreal 5.3 oder höher) verwenden, die den Mehrfenstermodus gut unterstützt.

Unterstützung für faltbare Geräte

Verwende die Jetpack WindowManager-Layout-Bibliothek, um faltbare Positionen wie den Tischmodus zu unterstützen und so die Immersion und Interaktion der Spieler zu steigern:

Abbildung 3. Spiele im Modus „Auf dem Tisch“ mit der Hauptansicht auf dem vertikalen Teil des Displays und den Steuerelementen auf dem horizontalen Teil.

Kotlin

fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean {
    contract { returns(true) implies (foldFeature != null) }
    return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
            foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
}

Java

boolean isTableTopPosture(FoldingFeature foldFeature) {
    return (foldFeature != null) &&
           (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) &&
           (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL);
}