Supporta il ridimensionamento di schermi di grandi dimensioni

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

Configurazione di base per schermi grandi

Dichiara se il tuo gioco è in grado di gestire la ridimensionabilità:

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

Se non è possibile supportare la ridimensionabilità, assicurati che il 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 Giochi su PC, la piattaforma gestisce la ridimensionabilità delle finestre rispettando le proporzioni specificate. Le dimensioni della finestra vengono bloccate automaticamente alle dimensioni ottimali. Devi supportare almeno proporzioni 16:9 se l'orientamento principale è orizzontale e 9:16 se il gioco è in modalità verticale. Per un'esperienza ottimale, supporta esplicitamente le proporzioni 21:9, 16:10 e 3:2 per i giochi orizzontali. La ridimensionabilità delle finestre non è obbligatoria in questo caso, ma è comunque utile per altri fattori di forma compatibili.

Per ulteriori informazioni e best practice, consulta l'articolo Configurare le immagini per Google Play Giochi su PC.

Schermi grandi di ChromeOS e Android

Per massimizzare l'area visibile del tuo gioco a schermo intero su ChromeOS e sui dispositivi Android con schermi grandi, supporta la modalità immersiva a schermo intero e nascondi le barre di sistema impostando i flag su decorView, la visibilità dell'interfaccia utente di sistema o tramite l'API WindowInsetsCompat. Dovrai anche gestire agevolmente la rotazione e il ridimensionamento degli eventi di configurazione o impedire che si verifichino sui dispositivi ChromeOS.

Tieni presente che sui dispositivi Android con schermi grandi, 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 delle finestre, la piattaforma applica il formato letterbox al tuo gioco in modalità di compatibilità e, se necessario, invia un messaggio al player prima di passare a una configurazione non supportata.

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

Su alcuni dispositivi, quando un giocatore passa a una configurazione non supportata, gli potrebbe essere chiesto di ricaricare il gioco e ricreare l'attività in base al layout della nuova finestra, interrompendo così l'esperienza di gioco. Testa il tuo gioco in varie configurazioni di modalità multi-finestra (2/3, 1/2, 1/3 della dimensione della finestra) e verifica che nessun elemento di gameplay o UI diventi tagliato o inaccessibile. Inoltre, verifica come il tuo gioco risponde alla continuità pieghevole quando si sposta tra lo schermo interno e quello esterno dei dispositivi pieghevoli. In caso di problemi, gestisci in modo esplicito questi eventi di configurazione e aggiungi il supporto avanzato per il ridimensionamento degli schermi di grandi dimensioni.

Ridimensionabilità avanzata per schermi di grandi dimensioni

Figura 2. Diverse UI su desktop e pieghevoli in una posizione da tavolo.

Per uscire dalla modalità compatibilità ed evitare la ricreazione dell'attività, procedi nel seguente modo:

  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 tuo 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 orientamento, dimensioni della finestra, larghezza e altezza correnti:

    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 sulla WindowManager per controllare la rotazione attuale del dispositivo. Utilizzando questi metadati, controlla le nuove dimensioni della finestra ed esegui il rendering alla dimensione intera. Questa operazione potrebbe non funzionare in tutti i casi a causa delle differenze nelle proporzioni. Quindi, in alternativa, ancora la tua interfaccia utente del gioco alle nuove dimensioni della finestra e applica il letterbox ai tuoi contenuti principali del gameplay. Se ci sono limitazioni tecniche o di progettazione che impediscono entrambi gli approcci, crea il tuo letterbox interno al motore per mantenere le proporzioni e ridimensiona al massimo le dimensioni possibili dichiarando resizeableActivity = false ed evitando la modalità di configurazione.

Indipendentemente dall'approccio adottato, testa il tuo gioco in varie configurazioni (piega e apri, modifiche alla rotazione diverse, modalità schermo diviso) e assicurati che non ci siano elementi di interfaccia utente in-game di tipo tagliato o sovrapposto, problemi di accessibilità del target touch o problemi di proporzioni che fanno sì che il gioco diventi allungato, schiacciato o altrimenti distorto.

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

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 delle attività; tuttavia, lo stato ripristinato delle app in più finestre varia su diverse versioni di Android (consulta la sezione Ciclo di vita dell'attività in modalità multi-finestra in Supporto della modalità multi-finestra).

Quando il player attiva la modalità multi-finestra per un'app o un gioco, il sistema notifica l'attività relativa a una modifica della configurazione, come specificato nella sezione Ridimensionabilità avanzata degli schermi grandi. Una modifica alla configurazione si verifica anche quando il giocatore ridimensiona il gioco o reimposta il gioco in modalità a schermo intero.

Non c'è alcuna garanzia che l'applicazione riprenda lo stato attivo quando viene impostata in modalità multi-finestra. Di conseguenza, se utilizzi uno qualsiasi degli eventi stato dell'app per mettere in pausa il gioco, non fare affidamento sull'evento di interesse di acquisizione (onWindowFocusChanged() con valore dello stato attivo impostato su true) per riprendere il gioco. Utilizza invece altri gestori di eventi o di modifica 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à multi-finestra su ChromeOS, le dimensioni iniziali della finestra diventano una considerazione importante. Un gioco non deve necessariamente essere a schermo intero e dovrai dichiarare le dimensioni della finestra corrispondenti. Ci sono due modi consigliati per affrontare questo problema.

La prima opzione funziona utilizzando attributi specifici nel tag <layout> nel file manifest Android. Gli attributi defaultHeight e defaultWidth controllano le dimensioni iniziali. Fai attenzione anche agli attributi minHeight e minWidth per impedire ai giocatori di ridimensionare la finestra del gioco in dimensioni non supportate. Infine, l'attributo gravity determina la posizione sullo schermo in cui viene visualizzata la finestra quando viene avviata. Di seguito è riportato 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 l'impostazione delle dimensioni della finestra prevede l'uso di limiti di avvio dinamici. Se utilizzi setLaunchBounds(Rect)⁠⁠, puoi definire le dimensioni iniziali della finestra. Se viene specificato un rettangolo vuoto, l'attività viene avviata in stato ingrandito.

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

Supporto pieghevole per postura

Usa la libreria di layout di Jetpack WindowManager per supportare posizioni pieghevoli, come il piano da tavolo, per aumentare l'immersione e il coinvolgimento dei giocatori:

Figura 3. Gioco in posizione da tavolo con vista principale sulla parte verticale del display e controlli nella 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);
}