Supporta il ridimensionamento di schermi di grandi dimensioni

L'espansione dagli smartphone a diversi fattori di forma con schermi di grandi dimensioni introduce considerazioni su come il gioco gestisce la gestione delle finestre. Su Googlebook, ChromeOS e Google Play Games su PC, il gioco può essere eseguito in modalità finestra su un'interfaccia desktop principale. Sui nuovi tablet e pieghevoli Android con Android 12L (livello API 32) o versioni successive con larghezza dello schermo > 600 dp, il tuo gioco può essere eseguito affiancato ad altre applicazioni in modalità schermo diviso, essere ridimensionato e persino spostato tra il display interno ed esterno sui dispositivi pieghevoli, con conseguente modifica della configurazione per le dimensioni della finestra e, su alcuni dispositivi, dell'orientamento.

Ridimensionamento con i giochi Unity

Configurazione di base per schermi di grandi dimensioni

Dichiara se il tuo gioco è in grado di gestire il ridimensionamento:

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

Se non è possibile supportare il ridimensionamento, assicurati che il file manifest del gioco definisca esplicitamente le proporzioni minime e massime supportate:

<!-- 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 Giochi su PC

Per Google Play Games su PC, la piattaforma gestisce il ridimensionamento della finestra rispettando le proporzioni specificate. Le dimensioni della finestra vengono bloccate automaticamente sulle dimensioni ottimali. Devi supportare almeno proporzioni 16:9 se l'orientamento principale è orizzontale e proporzioni 9:16 se il gioco è in modalità verticale. Per un'esperienza ottimale, supporta esplicitamente i formati 21:9, 16:10 e 3:2 per un gioco in formato orizzontale. Il ridimensionamento della finestra non è necessario qui, ma è comunque utile per la compatibilità con altri fattori di forma.

Per ulteriori informazioni e best practice, consulta Configurare la grafica per Google Play Giochi su PC.

Schermi grandi

Per massimizzare l'area visibile del gioco a schermo intero su tablet, dispositivi pieghevoli, Googlebook, ChromeOS e display connessi con schermi di grandi dimensioni, supporta la modalità immersiva a schermo intero e nascondi le barre di sistema impostando i flag su decorView, la visibilità della UI di sistema o tramite l'API WindowInsetsCompat. Inoltre, ti consigliamo di gestire correttamente gli eventi di configurazione di rotazione e ridimensionamento o di impedirne l'esecuzione.

Tieni presente che sui dispositivi Android con schermi di grandi dimensioni, il gioco può essere eseguito in configurazioni che potresti non gestire già. Se il tuo gioco non supporta tutte le configurazioni di dimensioni e orientamento della finestra, la piattaforma aggiunge barre nere al gioco in modalità di compatibilità e, se necessario, chiede al giocatore prima di passare a una configurazione non supportata.

Figura 1. Finestra di dialogo di compatibilità della configurazione.

Su alcuni dispositivi, quando un giocatore passa a una configurazione non supportata, potrebbe essere visualizzata un'opzione per ricaricare il gioco e ricreare l'attività in modo che si adatti meglio al nuovo layout della finestra, il che interrompe l'esperienza di gioco. Testa il gioco in varie configurazioni della modalità multi-finestra (dimensioni della finestra 2/3, 1/2, 1/3) e verifica che nessun elemento di gameplay o UI venga tagliato o diventi inaccessibile. Inoltre, testa la risposta del gioco alla continuità pieghevole quando passi dallo schermo interno a quello esterno sui dispositivi pieghevoli. Se riscontri problemi, gestisci esplicitamente questi eventi di configurazione e aggiungi il supporto avanzato per il ridimensionamento su schermi di grandi dimensioni.

Ridimensionamento avanzato per schermi di grandi dimensioni

Figura 2. Interfacce utente diverse su computer e pieghevole in modalità Tavolo.

Per uscire dalla modalità compatibilità ed evitare la ricreazione dell'attività:

  1. Dichiara la tua attività principale come ridimensionabile:

    <android:resizeableActivity="true" />
    
  2. Dichiara il supporto esplicito per "orientation", "screenSize", "smallestScreenSize", "screenLayout" e "density" nell'attributo android:configChanges dell'elemento <activity> del manifest del gioco per ricevere tutti gli eventi di configurazione dello schermo di grandi dimensioni:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. Esegui l'override di onConfigurationChanged() e gestisci l'evento di configurazione, inclusi l'orientamento corrente, le dimensioni della finestra, la larghezza e l'altezza:

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

Puoi anche eseguire una query su WindowManager per controllare la rotazione attuale del dispositivo. Utilizzando questi metadati, controlla le dimensioni della nuova finestra e il rendering a schermo intero. Questa soluzione potrebbe non funzionare in tutti i casi a causa delle differenze di proporzioni, quindi in alternativa puoi ancorare l'interfaccia utente del gioco alle nuove dimensioni della finestra e aggiungere barre nere sopra e sotto i contenuti di gioco principali. Se esistono limitazioni tecniche o di progettazione che impediscono uno dei due approcci, esegui il letterbox nel motore per preservare le proporzioni e ridimensiona il video in modo da ottenere le dimensioni migliori possibili dichiarando resizeableActivity = false ed evitando la modalità di configurazione.

Indipendentemente dall'approccio adottato, testa il gioco in varie configurazioni (piegatura e apertura, diverse modifiche alla rotazione, modalità split-screen) e assicurati che non ci siano elementi dell'interfaccia utente di gioco tagliati o sovrapposti, problemi di accessibilità dei target di tocco o problemi di proporzioni che causano lo stiramento, lo schiacciamento o la distorsione del gioco.

Inoltre, gli schermi più grandi di solito hanno pixel più grandi, perché hai lo stesso numero di pixel per un'area molto più grande. Ciò può causare la pixelizzazione dei buffer di rendering ridimensionati o degli asset a risoluzione inferiore. Utilizza gli asset di massima qualità sui dispositivi con schermi di grandi dimensioni e crea un profilo delle prestazioni del gioco per assicurarti che non ci siano problemi. Se il tuo gioco supporta più livelli di qualità, assicurati che tenga conto dei dispositivi con schermi grandi.

Modalità multi-finestra

La modalità multi-finestra consente a più app di condividere lo stesso schermo contemporaneamente. La modalità multi-finestra non modifica il ciclo di vita dell'attività; tuttavia, lo stato di ripresa delle app in più finestre varia a seconda delle versioni di Android (vedi Ciclo di vita dell'attività in modalità multi-finestra in Supportare la modalità multi-finestra).

Quando il giocatore mette un'app o un gioco in modalità multi-finestra, il sistema notifica all'attività una modifica alla configurazione come specificato nella sezione Ridimensionamento avanzato per schermi di grandi dimensioni. Una modifica della configurazione si verifica anche quando il giocatore ridimensiona il gioco o lo riporta in modalità a schermo intero.

Non è garantito che l'applicazione riacquisti lo stato attivo quando viene inserita in modalità multi-finestra. Pertanto, se utilizzi uno degli eventi di stato dell'app per mettere in pausa il gioco, non fare affidamento sull'evento di acquisizione dello stato attivo (onWindowFocusChanged() con valore dello stato attivo true) per riprendere il gioco. Utilizza invece altri gestori di eventi o gestori di modifiche dello stato come onConfigurationChanged() o onResume(). Tieni presente che puoi sempre utilizzare il metodo isInMultiWindowMode() per rilevare se l'attività corrente è in esecuzione in modalità multi-finestra.

Con la modalità di visualizzazione a finestre del desktop su Googlebook, ChromeOS e tablet e pieghevoli con schermi di grandi dimensioni, le dimensioni iniziali della finestra diventano un aspetto importante da considerare. Un gioco non deve essere a schermo intero e devi dichiarare le dimensioni della finestra in questo caso. Esistono due modi consigliati per affrontare questo problema.

La prima opzione funziona utilizzando attributi specifici nel tag <layout> nel file manifest di Android. Gli attributi defaultHeight e defaultWidth controllano le dimensioni iniziali. Tieni presente anche gli attributi minHeight e minWidth per impedire ai giocatori di ridimensionare la finestra di gioco in dimensioni non supportate. Infine, c'è l'attributo gravity, che determina in quale punto dello schermo viene visualizzata la finestra all'avvio. Ecco un esempio di tag di layout che utilizza questi attributi:

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

La seconda opzione per impostare le dimensioni della finestra funziona tramite l'utilizzo di limiti di avvio dinamici. Utilizzando setLaunchBounds(Rect)⁠⁠, puoi definire le dimensioni della finestra iniziale. Se viene specificato un rettangolo vuoto, l'attività viene avviata in stato massimizzato.

Inoltre, se utilizzi i motori grafici Unity o Unreal, assicurati di utilizzare una versione recente (Unity 2019.4.40 e Unreal 5.3 o versioni successive) che offra un buon supporto per la modalità multi-finestra.

Supporto per la postura pieghevole

Utilizza la libreria di layout WindowManager di Jetpack per supportare le posture pieghevoli, ad esempio quella a cavalletto, per aumentare l'immersione e il coinvolgimento dei giocatori:

Figura 3. Gioco in posizione da tavolo con la visualizzazione principale sulla parte verticale del display e i controlli sulla parte orizzontale.

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