次のような状況では、アプリが PiP モードにならないようにする必要があります。
- 動画が停止または一時停止されている場合。
- 動画プレーヤーとは異なるページに移動している場合。
アプリが PIP モードに入るタイミングを制御するには、mutableStateOf
を使用して動画プレーヤーの状態を追跡する変数を追加します。
動画の再生状況に基づいて状態を切り替える
動画プレーヤーの再生状態に応じて状態を切り替えるには、動画プレーヤーにリスナーを追加します。プレーヤーが再生中かどうかに基づいて、状態変数の状態を切り替えます。
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
プレーヤーがリリースされているかどうかに基づいて状態を切り替える
プレーヤーがリリースされたら、状態変数を false
に設定します。
fun releasePlayer() { shouldEnterPipMode = false }
状態を使用して PiP モードが開始されたかどうかを定義する(Android 12 以前)
- 12 より前の PiP の追加では
DisposableEffect
が使用されるため、newValue
を状態変数として設定してrememberUpdatedState
で新しい変数を作成する必要があります。これにより、DisposableEffect
内で更新されたバージョンが使用されます。 OnUserLeaveHintListener
がトリガーされたときの動作を定義するラムダで、enterPictureInPictureMode()
の呼び出しの周囲に状態変数を含むif
ステートメントを追加します。val currentShouldEnterPipMode by rememberUpdatedState(newValue = shouldEnterPipMode) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && Build.VERSION.SDK_INT < Build.VERSION_CODES.S ) { val context = LocalContext.current DisposableEffect(context) { val onUserLeaveBehavior: () -> Unit = { if (currentShouldEnterPipMode) { context.findActivity() .enterPictureInPictureMode(PictureInPictureParams.Builder().build()) } } context.findActivity().addOnUserLeaveHintListener( onUserLeaveBehavior ) onDispose { context.findActivity().removeOnUserLeaveHintListener( onUserLeaveBehavior ) } } } else { Log.i("PiP info", "API does not support PiP") }
状態を使用して PiP モードが開始されたかどうかを定義する(Android 12 以降)
状態変数を setAutoEnterEnabled
に渡して、アプリが適切なタイミングでのみ PiP モードに入るようにします。
val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() // Add autoEnterEnabled for versions S and up if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
setSourceRectHint
を使用してスムーズなアニメーションを実装する
setSourceRectHint
API は、PiP モードへの移行をスムーズにアニメーション化します。Android 12 以降では、PIP モードの終了時のスムーズなアニメーションも作成されます。この API を PIP ビルダーに追加して、PIP への遷移後に表示されるアクティビティの領域を指定します。
- アプリが PiP モードに入るように状態が定義されている場合にのみ、
setSourceRectHint()
をbuilder
に追加します。これにより、アプリが PiP に入る必要がないときにsourceRect
を計算する必要がなくなります。 sourceRect
値を設定するには、修飾子のonGloballyPositioned
関数から返されたlayoutCoordinates
を使用します。builder
でsetSourceRectHint()
を呼び出し、sourceRect
変数を渡します。
val context = LocalContext.current val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (shouldEnterPipMode) { val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect() builder.setSourceRectHint(sourceRect) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)