PIP 모드 개선사항

Android 12에서는 PIP 모드의 동작 개선사항과 새로운 기능을 도입합니다.

한 번 탭하기와 두 번 탭하기의 동작 개선사항

Android 12에서는 한 번 탭하기와 두 번 탭하기의 PIP 동작을 다음과 같이 개선했습니다.

  • 이제 PIP 창을 한 번 탭하면 사용자를 위한 컨트롤이 표시됩니다. 이전에는 한 번 탭하면 PIP 창이 확장되며 컨트롤이 표시되었습니다.

  • 이제 PIP 창을 두 번 탭하면 현재 PIP 크기와 최대 PIP 크기 간에 전환됩니다. 이전에는 두 번 탭하면 PIP 모드가 전체 화면 모드로 전환되었습니다.

새로운 기능

Android 12에서 도입된 PIP 모드의 새로운 기능은 다음과 같습니다.

동작 탐색에서 PIP 모드로 더 원활하게 전환하는 새 API 플래그

Android 12에서는 새 setAutoEnterEnabled 플래그를 사용하여 동작 탐색 모드에서 위로 스와이프하여 홈으로 이동할 때 PIP 모드로 더 원활하게 전환할 수 있습니다. 이전에는 Android에서 위로 스와이프하여 홈으로 이동 애니메이션이 완료될 때까지 기다린 후 PIP 창을 페이드 인했습니다.

이 기능을 구현하는 방법은 다음과 같습니다.

  1. 다음과 같이 setAutoEnterEnabled를 사용하여 PictureInPictureParams.Builder를 구성합니다.

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
    
  2. 최신 PictureInPictureParams를 사용하여 setPictureInPictureParams를 조기에 호출합니다. 앱은 Android 11에서와같이 onUserLeaveHint 콜백을 기다리지 않아야 합니다.

    예를 들어 앱은 맨 처음 재생과 가로세로 비율이 변경된 경우 후속 재생에서 setPictureInPictureParams를 호출하려고 할 수 있습니다.

  3. 필요에 따라 setAutoEnterEnabled(false)를 호출합니다. 예를 들어 현재 재생이 일시중지된 상태라면 동영상 앱이 PIP로 전환되지 않는 것이 좋을 수 있습니다.

동영상이 아닌 콘텐츠의 원활한 크기 조절을 사용 중지하는 새 API 플래그

Android 12에서는 PIP 창에서 동영상이 아닌 콘텐츠의 크기를 조절할 때 훨씬 더 매끄러운 크로스페이드 애니메이션을 제공하는 SeamlessResizeEnabled 플래그를 추가합니다. 이전에는 PIP 창에서 동영상이 아닌 콘텐츠의 크기를 조절하면 시각적 아티팩트가 부자연스럽게 보일 수 있었습니다.

setSeamlessResizeEnabled 플래그는 이전 버전과의 호환성을 위해 기본적으로 true로 설정됩니다. 동영상 콘텐츠의 경우 true 설정으로 두고 동영상이 아닌 콘텐츠의 경우 false로 변경합니다.

동영상이 아닌 콘텐츠의 원활한 크기 조절을 사용 중지하려면 다음을 실행하세요.

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

PIP 모드를 종료할 때 더 매끄러운 애니메이션 지원

Android 12에서는 이제 PIP 모드를 종료할 때 더 매끄러운 애니메이션을 구현하기 위해 SourceRectHint 플래그가 재사용됩니다. 종료 시 시스템은 PIP 전환에 사용된 원래 Rect이든 앱에서 제공한 업데이트된 Rect이든 상관없이 현재 사용 가능한 sourceRectHint를 사용하여 애니메이션을 만듭니다.

이 기능을 구현하려면 다음과 같이 앱을 업데이트하세요.

  1. 매끄러운 들어가기 애니메이션을 위해 sourceRectHintaspectRatio를 사용하여 PictureInPictureParams를 계속 구성합니다.

  2. 필요하다면 시스템에서 나가기 전환을 시작하기 전에 sourceRectHint를 업데이트합니다. 시스템에서 PIP 모드를 종료하려고 하면 활동의 뷰 계층 구조가 대상 구성(예: 전체 화면)에 배치됩니다. 앱은 레이아웃 변경 리스너를 루트 뷰나 타겟 뷰(예: 동영상 플레이어 뷰)에 연결하여 이벤트를 감지하고 애니메이션이 시작되기 전에 sourceRectHint를 업데이트할 수 있습니다.

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

새 동작 지원

Android 12에서는 이제 PIP 창을 숨기는 동작과 손가락을 모으거나 펼쳐 확대/축소하는 동작이 지원됩니다.

  • 창을 숨기려면 사용자가 창을 왼쪽이나 오른쪽 가장자리로 드래그하면 됩니다. 창을 다시 꺼내려면 사용자는 숨긴 창에서 보이는 부분을 탭하거나 드래그하면 됩니다.

  • 이제 사용자는 손가락을 모으거나 펼쳐 확대/축소 동작을 사용하여 PIP 창의 크기를 조절할 수 있습니다.