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:
Use
setAutoEnterEnabled
para construirPictureInPictureParams.Builder
, desta maneira:setPictureInPictureParams(new PictureInPictureParams.Builder() .setAspectRatio(aspectRatio) .setSourceRectHint(sourceRectHint) .setAutoEnterEnabled(true) .build());
Chame
setPictureInPictureParams
usando osPictureInPictureParams
atualizados anteriormente. O app não pode aguardar o callbackonUserLeaveHint
, 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.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:
Continue a construir
PictureInPictureParams
usando ossourceRectHint
e aaspectRatio
para uma animação de entrada suave.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.