Compatibilidad con el cambio de tamaño de pantalla grande

La expansión de teléfonos a diferentes factores de forma de pantallas grandes presenta consideraciones sobre la manera en que tu juego controla la administración de ventanas. En ChromeOS y Google Play Juegos para PC, tu juego puede ejecutarse en modo de ventana sobre una interfaz principal de escritorio. En los nuevos dispositivos plegables y tablets Android que ejecutan Android 12L (nivel de API 32) o versiones posteriores con un ancho de pantalla superior a 600 dp, el juego puede ejecutarse uno al lado del otro en el modo de pantalla dividida con otras aplicaciones, cambiar su tamaño y moverse entre la pantalla interior y exterior de los dispositivos plegables, lo que genera un cambio de configuración del tamaño de la ventana y, en algunos dispositivos, la orientación.

Capacidad de cambio de tamaño con juegos de Unity

Configuración básica de pantalla grande

Declara si tu juego puede controlar el cambio de tamaño:

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

Si no es compatible con el cambio de tamaño, asegúrate de que el manifiesto del juego defina de forma explícita las relaciones de aspecto mínimas y máximas admitidas:

<!-- 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 Juegos para PC

En Google Play Juegos para PC, la plataforma controla el cambio de tamaño de la ventana y respeta la relación de aspecto especificada. El tamaño de la ventana se bloquea automáticamente en las dimensiones óptimas. Debes admitir, al menos, una relación de aspecto de 16:9 si la orientación principal es horizontal y una de 9:16 si el juego está en modo vertical. Para obtener la mejor experiencia, admite explícitamente relaciones de aspecto de 21:9, 16:10 y 3:2 para los juegos en modo horizontal. En este caso, no es necesario cambiar el tamaño de la ventana, pero sí es recomendable para la compatibilidad con otros factores de forma.

Si deseas obtener más información y las prácticas recomendadas, consulta Cómo configurar gráficos para Google Play Juegos para PC.

Pantallas grandes de ChromeOS y Android

Para maximizar el área visible de tu juego en pantalla completa en ChromeOS y en dispositivos Android de pantalla grande, admite el modo envolvente de pantalla completa y oculta las barras del sistema estableciendo marcas en decorView, la visibilidad de la IU del sistema o a través de la API de WindowInsetsCompat. También te recomendamos controlar de forma correcta los eventos de configuración de rotación y cambio de tamaño, o bien evitar que ocurran en dispositivos ChromeOS.

Ten en cuenta que en los dispositivos Android de pantalla grande, el juego puede ejecutarse en configuraciones que quizás aún no manejas. Si tu juego no admite todas las configuraciones de tamaño y orientación de ventana, la plataforma mostrará tu juego en formato letterbox en modo de compatibilidad y, de ser necesario, enviará una solicitud al jugador antes de cambiar a una configuración no compatible.

Figura 1: Cuadro de diálogo de compatibilidad de configuración

En algunos dispositivos, cuando un jugador se mueve a una configuración no compatible, es posible que se le solicite la opción de volver a cargar el juego y recrear la actividad para que se ajuste mejor al nuevo diseño de la ventana, lo que interrumpe la experiencia de juego. Prueba tu juego en varias configuraciones del modo multiventana (2/3, 1/2, 1/3 de tamaño de ventana) y verifica que no haya elementos del juego ni de la IU cortados o inaccesibles. Además, prueba cómo responde tu juego a la continuidad del dispositivo plegable cuando se mueve entre la pantalla interior y exterior en dispositivos plegables. Si observas problemas, controla de forma explícita estos eventos de configuración y agrega compatibilidad avanzada con la capacidad de cambiar el tamaño de las pantallas grandes.

Capacidad avanzada de cambio de tamaño de pantalla grande

Figura 2: Diferentes IUs en computadoras de escritorio y dispositivos plegables en posición de mesa

Para salir del modo de compatibilidad y evitar la recreación de actividades, haz lo siguiente:

  1. Declara tu actividad principal como de tamaño variable:

    <android:resizeableActivity="true" />
    
  2. Declara la compatibilidad explícita con "orientation", "screenSize", "smallestScreenSize", "screenLayout" y "dense" en el atributo android:configChanges del elemento <activity> del manifiesto del juego para recibir todos los eventos de configuración de pantalla grande:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. Anula onConfigurationChanged() y controla el evento de configuración, incluida la orientación, el tamaño, el ancho y la altura actuales de la ventana:

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

También puedes consultar el WindowManager para comprobar la rotación actual del dispositivo. Con estos metadatos, comprueba las nuevas dimensiones de la ventana y procesa en el tamaño completo de la ventana. Es posible que esto no funcione en todos los casos debido a las diferencias en la relación de aspecto. Como alternativa, ancla la IU de tu juego en el nuevo tamaño de ventana y formato letterbox de tu contenido principal del juego. Si hay limitaciones técnicas o de diseño que impiden cualquiera de estos enfoques, aplica tu propio formato letterbox en el motor para conservar la relación de aspecto y escalar a las mejores dimensiones posibles mientras declaras resizeableActivity = false y evitas el modo de configuración.

Independientemente del enfoque que adoptes, prueba tu juego en varias configuraciones (pliegue y desplegado, diferentes cambios de rotación, modo de pantalla dividida) y asegúrate de que no haya elementos de la IU cortados o superpuestos, problemas con la accesibilidad del objetivo táctil o problemas de relación de aspecto que provoquen que el juego se estire, aplaque o distorsione.

Además, las pantallas más grandes suelen significar píxeles más grandes, porque tienes la misma cantidad de píxeles para un área mucho más grande. lo que puede provocar que se pixelen los búferes de renderización de tamaño reducido o los recursos de menor resolución. Usa los recursos de mayor calidad en dispositivos con pantallas grandes y genera un perfil de rendimiento de tu juego para asegurarte de que no haya problemas. Si el juego admite varios niveles de calidad, asegúrate de que sea compatible con dispositivos con pantalla grande.

Modo multiventana

El modo multiventana permite que varias apps compartan la misma pantalla al mismo tiempo. El modo multiventana no cambia el ciclo de vida de la actividad; sin embargo, el estado reanudado de las apps en varias ventanas difiere en las diferentes versiones de Android (consulta Ciclo de vida de la actividad en el modo multiventana en Compatibilidad con el modo multiventana).

Cuando el jugador coloca una app o un juego en el modo multiventana, el sistema notifica a la actividad sobre un cambio de configuración, como se especifica en la sección Capacidad avanzada de ajuste de tamaño de pantalla grande. También se produce un cambio de configuración cuando el jugador cambia el tamaño del juego o lo coloca nuevamente en el modo de pantalla completa.

No hay garantía de que la app recupere el foco cuando se establezca en el modo multiventana. Por lo tanto, si usas alguno de los eventos de estado de la app para pausar el juego, no dependas del evento de adquisición de enfoque (onWindowFocusChanged() con el valor de enfoque como verdadero) para reanudar el juego. En su lugar, usa otros controladores de eventos o controladores de cambio de estado, como onConfigurationChanged() o onResume(). Ten en cuenta que siempre puedes usar el método isInMultiWindowMode() para detectar si la actividad actual se está ejecutando en el modo multiventana.

Con el modo multiventana de ChromeOS, las dimensiones iniciales de las ventanas se convierten en una consideración importante. No es necesario que los juegos estén en pantalla completa. Por lo tanto, deberás declarar el tamaño de la ventana en ese caso. Hay dos formas recomendadas de abordar esto.

La primera opción usa atributos específicos en la etiqueta <layout> de tu manifiesto de Android. Los atributos defaultHeight y defaultWidth controlan las dimensiones iniciales. Además, ten en cuenta los atributos minHeight y minWidth para evitar que los jugadores cambien el tamaño de la ventana del juego a dimensiones que no admitas. Por último, está el atributo gravity, que determina en qué lugar de la pantalla aparece la ventana cuando se inicia. A continuación, se muestra un ejemplo de una etiqueta de diseño con estos atributos:

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

La segunda opción para configurar el tamaño de la ventana funciona con el uso de límites de inicio dinámicos. Si usas setLaunchBounds(Rect)⁠⁠, puedes definir las dimensiones de la ventana de inicio. Si se especifica un rectángulo vacío, la actividad se inicia en un estado maximizado.

Además, si usas los motores de juego Unity o Unreal, asegúrate de usar una versión reciente (Unity 2019.4.40 y Unreal 5.3 o posterior) que proporcione una buena compatibilidad con el modo multiventana.

Compatibilidad con posiciones plegables

Usa la biblioteca de diseño WindowManager de Jetpack para admitir posiciones plegables, como las de mesa, a fin de aumentar la inmersión y la participación de los jugadores:

Figura 3: Juego en posición de mesa con vista principal en la parte vertical de la pantalla y controles en la parte horizontal.

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