Unterstützung großer Bildschirmgrößen

Die Erweiterung von Smartphones auf verschiedene große Bildschirmformen führt zu Überlegungen darüber, wie dein Spiel mit der Fensterverwaltung umgeht. Unter ChromeOS und Google Play Spiele auf dem PC kann Ihr Spiel im Fenstermodus über einer Desktop-Hauptoberfläche ausgeführt werden. Auf neuen Android-Tablets und faltbaren Geräten mit Android 12L (API-Level 32) oder höher und einer Bildschirmbreite von mehr als 600 dp kann Ihr Spiel im geteilten Bildschirm mit anderen Apps nebeneinander ausgeführt werden. Außerdem kann es auf faltbaren Geräten auch zwischen dem inneren und dem äußeren Display verschoben werden. Dies führt zu einer Konfigurationsänderung bei der Fenstergröße und auf einigen Geräten auch der Ausrichtung.

Grundlegende Konfiguration für große Bildschirme

Geben Sie an, ob Ihr Spiel die Größenanpassung unterstützt:

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

Wenn die Größenanpassung nicht unterstützt werden kann, achten Sie darauf, dass in der Manifestdatei des Spiels die minimalen und maximalen unterstützten Seitenverhältnisse explizit definiert sind:

<!-- 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 Spiele auf dem PC

Bei Google Play Spiele auf dem PC kann die Fenstergröße von der Plattform angepasst werden, wobei das angegebene Seitenverhältnis berücksichtigt wird. Die Fenstergröße wird automatisch auf die optimalen Abmessungen festgelegt. Wenn du als primäre Ausrichtung Querformat verwendest, muss ein Seitenverhältnis von mindestens 16:9 und im Hochformat ein Seitenverhältnis von 9:16 sein. Für eine optimale Leistung sollten bei Spielen im Querformat explizit die Seitenverhältnisse 21:9, 16:10 und 3:2 unterstützt werden. Eine Anpassung der Fenstergröße ist hier nicht erforderlich, ist aber aus Gründen der Kompatibilität mit anderen Formfaktoren sinnvoll.

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

ChromeOS und Android-Displays mit großen Bildschirmen

Wenn Sie den Anzeigebereich für Ihr Spiel auf ChromeOS-Geräten und Android-Geräten mit großen Bildschirmen im Vollbildmodus maximieren möchten, können Sie den immersiven Vollbildmodus unterstützen und die Systemleisten ausblenden, indem Sie Flags für decorView, die System-UI oder die WindowInsetsCompat API festlegen. Außerdem sollten Sie die Rotation und Größenanpassung von Konfigurationsereignissen reibungslos handhaben oder verhindern, dass sie auf ChromeOS-Geräten auftreten.

Hinweis: Auf Android-Geräten mit großen Bildschirmen kann dein Spiel in Konfigurationen ausgeführt werden, mit denen du möglicherweise noch nicht vertraut bist. Wenn Ihr Spiel nicht alle Konfigurationen für Fenstergröße und -ausrichtung unterstützt, wird Ihr Spiel im Kompatibilitätsmodus über die Letterbox-Option der Plattform angezeigt. Gegebenenfalls wird der Spieler darüber informiert, bevor zu einer nicht unterstützten Konfiguration gewechselt wird.

Abbildung 1: Dialogfeld für die Kompatibilität der Konfiguration.

Wenn ein Spieler zu einer nicht unterstützten Konfiguration wechselt, wird er auf einigen Geräten möglicherweise aufgefordert, das Spiel neu zu laden und die Aktivität neu zu erstellen, damit sie am besten in das neue Fensterlayout passt. Dadurch wird das Spiel gestört. Testen Sie Ihr Spiel in verschiedenen Konfigurationen im Mehrfenstermodus (2/3, 1/2, 1/3 Fenstergröße) und prüfen Sie, ob Gameplay oder UI-Elemente abgeschnitten werden oder nicht zugänglich sind. Außerdem kannst du testen, wie dein Spiel auf faltbare Geräte reagiert, wenn du zwischen innerem und äußerem Display wechselst. Wenn Probleme auftreten, bearbeiten Sie diese Konfigurationsereignisse explizit und fügen Sie erweiterte Unterstützung für die Größenanpassung großer Bildschirme hinzu.

Erweiterte Anpassung der Größe des großen Bildschirms

Abbildung 2: Verschiedene Benutzeroberflächen auf Computern und faltbaren Geräten in der Haltung „Auf dem Tisch“.

So verlassen Sie den Kompatibilitätsmodus:

  1. Deklarieren Sie Ihre Hauptaktivität als „anpassbar“:

    <android:resizeableActivity="true" />
    
  2. Deklarieren Sie die explizite Unterstützung für „orientation“, „screenSize“, „smallestScreenSize“, „screenLayout“ und „density“ im Attribut android:configChanges des Elements <activity> Ihres Spielemanifests, um alle Konfigurationsereignisse für große Bildschirme zu empfangen:

    <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 den WindowManager abfragen, um die aktuelle Gerätedrehung zu prüfen. Prüfen Sie mithilfe dieser Metadaten die Abmessungen des neuen Fensters und rendern Sie es in der vollen Fenstergröße. Aufgrund von Unterschieden im Seitenverhältnis funktioniert dies möglicherweise nicht in allen Fällen. Verankern Sie alternativ Ihre Spiele-UI an der neuen Fenstergröße und verankern Sie Ihre zentralen Gameplay-Inhalte im Letterbox-Format. Wenn beides aufgrund technischer oder konzeptioneller Einschränkungen nicht möglich ist, erstellen Sie ein eigenes Letterbox-Bild, um das Seitenverhältnis beizubehalten und auf die bestmöglichen Abmessungen zu skalieren, während Sie resizeableActivity = false deklarieren und den Konfigurationsmodus vermeiden.

Unabhängig vom gewählten Ansatz testen Sie Ihr Spiel in verschiedenen Konfigurationen (Faltung und Aufklappen, Änderungen bei der Rotation, Splitscreen-Modus) und achten Sie darauf, dass keine Elemente der Benutzeroberfläche abgeschnitten oder überlappen, keine Probleme mit der Zugänglichkeit des Touch-Ziels oder Probleme mit dem Seitenverhältnis auftreten, die dazu führen, dass das Spiel gestreckt, zerquetscht oder anderweitig verzerrt wird.

Außerdem bedeuten größere Bildschirme meist auch größere Pixel, da für eine viel größere Fläche die gleiche Anzahl von Pixeln zur Verfügung steht. Dies kann zu verpixelten Renderingzwischenspeichern oder Assets mit geringerer Auflösung führen. Nutzen Sie Ihre qualitativ hochwertigsten Assets auf Geräten mit großen Bildschirmen und nutzen Sie ein Leistungsprofil Ihres Spiels, um Probleme zu vermeiden. Wenn Ihr Spiel mehrere Qualitätsstufen unterstützt, achten Sie darauf, dass es auch für Geräte mit großen Bildschirmen geeignet ist.

Mehrfenstermodus

Mit dem Mehrfenstermodus können mehrere Apps denselben Bildschirm gleichzeitig teilen. Der Mehrfenstermodus ändert nicht den Aktivitätslebenszyklus. Der Status, dass Apps in mehreren Fenstern fortgeführt werden, unterscheidet sich jedoch bei verschiedenen Android-Versionen. Weitere Informationen finden Sie unter Aktivitätslebenszyklus im Mehrfenstermodus unter Unterstützung des Mehrfenstermodus.

Wenn der Spieler eine App oder ein Spiel in den Mehrfenstermodus versetzt, benachrichtigt das System die Aktivität einer Konfigurationsänderung, wie im Abschnitt Erweiterte Anpassung der Größe eines großen Bildschirms beschrieben. Eine Konfigurationsänderung tritt auch dann auf, wenn der Spieler die Größe des Spiels ändert oder das Spiel wieder in den Vollbildmodus versetzt.

Es gibt keine Garantie, dass die App im Mehrfenstermodus wieder im Fokus ist. Wenn Sie also eines der App-Statusereignisse zum Pausieren Ihres Spiels verwenden, verlassen Sie sich nicht auf das Ereignis „Akkus“ (onWindowFocusChanged() mit dem Fokuswert „true“), um das Spiel fortzusetzen. Verwenden Sie stattdessen andere Event-Handler oder Statusänderungs-Handler wie onConfigurationChanged() oder onResume(). Sie können jederzeit die Methode isInMultiWindowMode() verwenden, um festzustellen, ob die aktuelle Aktivität im Mehrfenstermodus ausgeführt wird.

Beim Mehrfenstermodus unter ChromeOS spielen die Abmessungen des ersten Fensters eine wichtige Rolle. Ein Spiel muss nicht im Vollbildmodus angezeigt werden. In diesem Fall sollten Sie die Größe des Fensters angeben. Dafür gibt es zwei empfohlene Vorgehensweisen.

Bei der ersten Option werden bestimmte Attribute im <layout>-Tag in Ihrem Android-Manifest verwendet. Mit den Attributen defaultHeight und defaultWidth werden die Anfangsdimensionen festgelegt. Achten Sie auch auf die Attribute minHeight und minWidth, damit Ihre Spieler das Spielfenster nicht an Dimensionen anpassen können, die Sie nicht unterstützen. Zu guter Letzt gibt es noch das Attribut gravity, mit dem festgelegt wird, wo auf dem Bildschirm das Fenster angezeigt wird, wenn es geöffnet wird. Hier ist 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 funktioniert durch die Verwendung dynamischer Startgrenzen. Mit setLaunchBounds(Rect)⁠⁠ können Sie die Abmessungen des Startfensters definieren. Wenn ein leeres Rechteck angegeben wird, wird die Aktivität im maximierten Zustand gestartet.

Wenn Sie die Spiel-Engines Unity oder Unreal verwenden, sollten Sie außerdem 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 die faltbare Haltung

Die WindowManager-Layoutbibliothek von Jetpack unterstützt faltbare Haltungen (z. B. auf dem Tisch), um die Immersion und Interaktion der Spieler zu fördern:

Abbildung 3: Spiel in einer „Auf dem Tisch“-Haltung mit Hauptansicht auf einem vertikalen Teil des Displays, Steuerung im horizontalen Bereich.

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);
}