Mejoras de pantalla en pantalla (PiP)

En Android 12, se introducen mejoras en el comportamiento del modo pantalla en pantalla (PiP) y funciones nuevas para este.

Mejoras en el comportamiento de presionar una vez y dos veces

En Android 12, se mejoró el comportamiento de PiP cuando se presiona una vez y dos veces, de la siguiente manera:

  • Ahora, si presionas una vez una ventana de PiP, se muestran los controles para el usuario. Anteriormente, si lo hacías, se expandía la ventana de PiP y se mostraban los controles.

  • Ahora, si presionas dos veces una ventana de PiP, cambia de su tamaño actual al tamaño máximo. Anteriormente, si lo hacías, el modo PiP cambiaba a pantalla completa.

Funciones nuevas

En Android 12, se introducen las siguientes funciones nuevas para el modo de PiP:

Marca nueva de API para brindar una transición más fluida al modo de PiP en la navegación por gestos

En Android 12, puedes usar la marca nueva setAutoEnterEnabled a fin de brindar transiciones más fluidas al modo de PiP cuando deslizas el dedo hacia arriba para ir a la pantalla principal en el modo de navegación por gestos. Anteriormente, Android esperaba a que terminara la animación de este deslizamiento hacia arriba antes de aplicar el fundido de entrada para la ventana de PiP.

Para implementar esta función, haz lo siguiente:

  1. Usa setAutoEnterEnabled para construir PictureInPictureParams.Builder de la siguiente manera:

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
    
  2. Llama a setPictureInPictureParams con la clase PictureInPictureParams actualizada con anticipación. La app no debe esperar la devolución de llamada onUserLeaveHint (como sí habría sucedido con Android 11).

    Por ejemplo, una app puede llamar a setPictureInPictureParams en la primera reproducción y en cualquier reproducción posterior si se cambia la relación de aspecto.

  3. Llama a setAutoEnterEnabled(false) según sea necesario. Por ejemplo, es probable que no sea óptimo que una app de video ingrese al modo de PiP si la reproducción actual está en pausa.

Marca nueva de API para inhabilitar el cambio fluido de tamaño de contenido que no sea video

En Android 12, se agrega la marca SeamlessResizeEnabled, que brinda una animación entre difuminados mucho más fluida cuando se cambia el tamaño de contenido que no sea video en la ventana de PiP. Anteriormente, si se cambiaba el tamaño de este tipo de contenido en una ventana de PiP, se podían crear artefactos visuales molestos.

De forma predeterminada, la marca setSeamlessResizeEnabled se configura en true para ofrecer retrocompatibilidad. Configúrala en true para el contenido de video y cámbiala a false para el contenido que no sea video.

Para inhabilitar el cambio fluido de tamaño de contenido que no sea video, usa el siguiente fragmento de código:

  setPictureInPictureParams(new PictureInPictureParams.Builder()
          .setSeamlessResizeEnabled(false)
          .build());

Compatibilidad con animaciones más fluidas para salir del modo de PiP

En Android 12, ahora la marca SourceRectHint se vuelve a usar para implementar animaciones más fluidas cuando se sale del modo de PiP. En la salida, el sistema crea la animación con la marca sourceRectHint disponible en ese momento, ya sea el objeto Rect original que se usa para ingresar al modo de PiP o un Rect actualizado que proporciona la app.

Para implementar esta función, actualiza la app de la siguiente manera:

  1. Continúa construyendo PictureInPictureParams con sourceRectHint y aspectRatio para lograr una animación de entrada fluida.

  2. Si es necesario, actualiza la marca sourceRectHint antes de que el sistema inicie la transición de salida. Cuando el sistema está a punto de salir del modo de PiP, la jerarquía de vistas de la actividad se presenta en su configuración de destino (por ejemplo, pantalla completa). La app puede adjuntar un objeto de escucha para el cambio de diseño a su vista raíz o de destino (como la vista del reproductor de video) a fin de detectar el evento y actualizar la marca sourceRectHint antes de que comience la animación.

      // Listener is called immediately after the user exits PIP but before animating.
      playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
                           oldLeft, oldTop, oldRight, oldBottom ->
          if (left != oldLeft || right != oldRight || top != oldTop
                  || bottom != oldBottom) {
             // The playerView's bounds changed, update the source hint rect to
             // reflect its new bounds.
             val sourceRectHint = Rect()
             playerView.getGlobalVisibleRect(sourceRectHint)
             setPictureInPictureParams(
                 PictureInPictureParams.Builder()
                     .setSourceRectHint(sourceRectHint)
                     .build()
             )
          }
      }
    

Compatibilidad con gestos nuevos

En Android 12, ahora se admiten gestos cuando almacenas la ventana de PiP y pellizcas para hacerle zoom:

  • Para almacenar la ventana, el usuario puede arrastrarla hacia el borde izquierdo o derecho. Para dejar de almacenar la ventana, el usuario puede presionar la parte visible de la ventana almacenada o arrastrarla hacia afuera.

  • Ahora, el usuario puede cambiar el tamaño de la ventana de PiP con la función de pellizcar para hacerle zoom.