Android 12 では、ピクチャー イン ピクチャー(PIP)モードの動作が改善され、新機能が導入されています。
シングルタップとダブルタップの動作の改善
Android 12 では、シングルタップとダブルタップの PIP 動作が次のように改善されています。
PIP ウィンドウをシングルタップするとコントロールが表示されるようになりました。以前はシングルタップで PIP ウィンドウが開き、コントロールが表示されていました。
PIP ウィンドウをダブルタップすると、現在の PIP サイズと最大 PIP サイズを切り替えられるようになりました。以前はダブルタップで PIP モードから全画面モードに切り替わっていました。
新機能
Android 12 では、PIP モードに以下の新機能が導入されています。
ジェスチャー ナビゲーションで PIP モードにスムーズに遷移するための新しい API フラグ
Android 12 では、新しい setAutoEnterEnabled
フラグを使用して、ジェスチャー ナビゲーション モードで下から上にスワイプしてホーム画面に戻る際の、PIP モードへの遷移をスムーズに行えるようになりました。以前は、下から上にスワイプしてホーム画面に戻るアニメーションが終了するのを待ってから、PIP ウィンドウにフェードインしていました。
この機能を実装するには以下を行います。
次のように、
setAutoEnterEnabled
を使用してPictureInPictureParams.Builder
を作成します。setPictureInPictureParams(new PictureInPictureParams.Builder() .setAspectRatio(aspectRatio) .setSourceRectHint(sourceRectHint) .setAutoEnterEnabled(true) .build());
最新の
PictureInPictureParams
を使って、早い段階でsetPictureInPictureParams
を呼び出します。これにより、アプリがonUserLeaveHint
コールバックを待たないようにします(Android 11 ではコールバックを待っていました)。たとえば、アプリは最初の再生と、アスペクト比が変更された場合は以降のすべての再生で、
setPictureInPictureParams
を呼び出す可能性があります。必要に応じて
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
であるかは問いません)。
この機能を実装するには、次のようにアプリを更新します。
スムーズな開始アニメーションを実現するために、引き続き
sourceRectHint
とaspectRatio
を使用してPictureInPictureParams
を作成します。必要に応じて、システムが終了遷移を開始する前に
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 ウィンドウのサイズを変更できるようになりました。