Melhorias no modo picture-in-picture (PiP)

O Android 12 introduz melhorias de comportamento e novos recursos para o modo picture-in-picture (PiP).

Melhorias de comportamento para toques únicos ou duplos

O Android 12 melhorou o comportamento do modo picture-in-picture para toques únicos e duplos desta forma:

  • Agora, ao tocar em uma janela do picture-in-picture, os controles serão exibidos para o usuário. Antes, um único toque expandia a janela do modo picture-in-picture e exibia os controles.

  • Agora, tocar duas vezes em uma janela do modo picture-in-picture alterna entre o tamanho atual e o máximo. Antes, tocar duas vezes colocava o picture-in-picture no modo tela cheia.

Novos recursos

O Android 12 introduz os novos recursos a seguir para o modo picture-in-picture:

Nova sinalização de API com transições mais suaves para o modo picture-in-picture na navegação por gestos

O Android 12 possibilita usar a nova sinalização setAutoEnterEnabled para oferecer transições mais suaves para o modo picture-in-picture ao deslizar para cima para ir à tela inicial no modo de navegação por gestos. Anteriormente, o Android aguardava a conclusão da animação de deslizar para cima para ir até a tela inicial antes de exibir a janela do picture-in-picture.

Para implementar esse recurso:

  1. Use setAutoEnterEnabled para construir PictureInPictureParams.Builder, desta maneira:

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
    
  2. Chame setPictureInPictureParams usando os PictureInPictureParams atualizados anteriormente. O app não pode aguardar o callback onUserLeaveHint, como faria no Android 11.

    Por exemplo, um app pode querer chamar setPictureInPictureParams na primeira reprodução e em qualquer reprodução seguinte se a proporção mudar.

  3. Chame setAutoEnterEnabled(false) conforme necessário. Por exemplo, provavelmente não é ideal para um app de vídeo entrar no modo picture-in-picture se a reprodução atual estiver no estado pausado.

Nova sinalização de API para desativar o redimensionamento contínuo de conteúdos que não são de vídeo

O Android 12 adiciona a sinalização SeamlessResizeEnabled, que fornece uma animação de esmaecimento muito mais suave ao redimensionar conteúdo que não é de vídeo na janela do modo picture-in-picture. Anteriormente, o redimensionamento desse tipo de conteúdo em uma janela picture-in-picture poderia criar artefatos visuais conflitantes.

A sinalização setSeamlessResizeEnabled está definida como true por padrão para compatibilidade com versões anteriores. Deixe essa opção definida como true para conteúdo de vídeo e mude para false se o conteúdo não for de vídeo.

Para desativar o redimensionamento contínuo de conteúdos que não são de vídeo:

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

Compatibilidade com animações mais suaves ao sair do modo picture-in-picture

No Android 12, a sinalização SourceRectHint agora é reutilizada para implementar uma animação mais suave ao sair do modo picture-in-picture. Ao sair do modo, o sistema cria a animação usando a sourceRectHint atual disponível, seja ela igual ao Rect original usado para entrar no modo picture-in-picture ou um Rect atualizado fornecido pelo app.

Para implementar esse recurso, atualize o app desta forma:

  1. Continue a construir PictureInPictureParams usando os sourceRectHint e a aspectRatio para uma animação de entrada suave.

  2. Se necessário, atualize a sourceRectHint antes do sistema iniciar a transição de saída. Quando o sistema está prestes a sair do modo picture-in-picture, a hierarquia de visualização da atividade é destinada à configuração de destino, por exemplo, tela cheia. O app pode anexar um listener de mudança de layout à visualização raiz ou de destino, como a do player de vídeo, para detectar o evento e atualizar a sourceRectHint antes do início da animação.

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

Compatibilidade com novos gestos

O Android 12 agora é compatível com gestos para ocultar e de pinça para controlar o zoom da janela picture-in-picture:

  • Para ocultar a janela, o usuário pode arrastá-la para a borda esquerda ou direita. Para retomar a janela, o usuário pode tocar na parte visível da janela oculta ou arrastá-la.

  • Agora o usuário pode redimensionar a janela do picture-in-picture usando o gesto de pinça para controlar o zoom.