Android 14 ベータ版がリリースされました。ぜひお試しいただき、ご意見、ご感想をお寄せください。

ピクチャー イン ピクチャー(PIP)の改善

Android 12 では、ピクチャー イン ピクチャー(PIP)モードの動作が改善され、新機能が導入されています。

シングルタップとダブルタップの動作の改善

Android 12 では、シングルタップとダブルタップの PIP 動作が次のように改善されています。

  • PIP ウィンドウをシングルタップするとコントロールが表示されるようになりました。以前はシングルタップで PIP ウィンドウが開き、コントロールが表示されていました。

  • PIP ウィンドウをダブルタップすると、現在の PIP サイズと最大 PIP サイズを切り替えられるようになりました。以前はダブルタップで PIP モードから全画面モードに切り替わっていました。

新機能

Android 12 では、PIP モードに以下の新機能が導入されています。

ジェスチャー ナビゲーションで PIP モードにスムーズに遷移するための新しい API フラグ

Android 12 では、新しい setAutoEnterEnabled フラグを使用して、ジェスチャー ナビゲーション モードで下から上にスワイプしてホーム画面に戻る際の、PIP モードへの遷移をスムーズに行えるようになりました。以前は、下から上にスワイプしてホーム画面に戻るアニメーションが終了するのを待ってから、PIP ウィンドウにフェードインしていました。

この機能を実装するには以下を行います。

  1. 次のように、setAutoEnterEnabled を使用して PictureInPictureParams.Builder を作成します。

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
    
  2. 最新の PictureInPictureParams を使って、早い段階で setPictureInPictureParams を呼び出します。これにより、アプリが onUserLeaveHint コールバックを待たないようにします(Android 11 ではコールバックを待っていました)。

    たとえば、アプリは最初の再生と、アスペクト比が変更された場合は以降のすべての再生で、setPictureInPictureParams を呼び出す可能性があります。

  3. 必要に応じて setAutoEnterEnabled(false) を呼び出します。たとえば、動画アプリではほとんどの場合、現在の再生が一時停止状態の場合に PIP モードに入ることは最適ではありません。

動画以外のコンテンツのシームレスなサイズ変更を無効にする新しい API フラグ

Android 12 では、SeamlessResizeEnabled フラグが追加されました。このフラグにより、PIP ウィンドウで動画以外のコンテンツのサイズを変更する際に、よりスムーズなクロスフェード アニメーションを提供できるようになりました。以前は、PIP ウィンドウで動画以外のコンテンツのサイズを変更すると、ユーザーに不快感を与える視覚的アーティファクトが発生していました。

下位互換性を維持するため、setSeamlessResizeEnabled フラグはデフォルトで true に設定されています。動画コンテンツの場合は true に設定されたままにして、動画以外のコンテンツの場合は false に変更します。

動画以外のコンテンツのシームレスなサイズ変更を無効にするには、次のようにします。

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

PIP モードの終了時のスムーズなアニメーションのサポート

Android 12 では、SourceRectHint フラグを再利用して、PIP モードの終了時のスムーズなアニメーションを実装できるようになりました。PIP モードの終了時に、その時点で使用可能な sourceRectHint を使用してアニメーションが作成されます(PIP に入るために使用された元の Rect であるか、アプリが提供する更新された Rect であるかは問いません)。

この機能を実装するには、次のようにアプリを更新します。

  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 ウィンドウのサイズを変更できるようになりました。