Aplikasi Anda tidak boleh memasuki mode PiP dalam situasi berikut:
- Jika video dihentikan atau dijeda.
- Jika Anda berada di halaman aplikasi yang berbeda dengan pemutar video.
Untuk mengontrol kapan aplikasi Anda memasuki mode PiP, tambahkan variabel yang melacak status
pemutar video menggunakan mutableStateOf.
Mengubah status berdasarkan apakah video sedang diputar
Untuk mengubah status berdasarkan apakah pemutar video sedang memutar, tambahkan pemroses di pemutar video. Alihkan status variabel status Anda berdasarkan apakah pemutar sedang memutar atau tidak:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
Mengalihkan status berdasarkan apakah pemutar dilepaskan
Saat pemutar dilepaskan, tetapkan variabel status Anda ke false:
fun releasePlayer() { shouldEnterPipMode = false }
Gunakan status untuk menentukan apakah mode PiP dimasukkan (sebelum Android 12)
- Karena penambahan PiP sebelum Android 12 menggunakan
DisposableEffect, Anda perlu membuat variabel baru denganrememberUpdatedStatedengannewValueditetapkan sebagai variabel status Anda. Hal ini akan memastikan bahwa versi yang diupdate digunakan dalamDisposableEffect. Dalam lambda yang menentukan perilaku saat
OnUserLeaveHintListenerdipicu, tambahkan pernyataanifdengan variabel status di sekitar panggilan keenterPictureInPictureMode():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 = Runnable { 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") }
Gunakan status untuk menentukan apakah mode PiP dimasukkan (setelah Android 12)
Teruskan variabel status Anda ke setAutoEnterEnabled agar aplikasi Anda hanya memasuki
mode PiP pada waktu yang tepat:
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)
Gunakan setSourceRectHint untuk animasi yang lancar
API setSourceRectHint membuat animasi yang lebih lancar untuk memasuki mode PiP. Di Android 12+, animasi yang lebih lancar juga dibuat untuk keluar dari mode PiP.
Tambahkan API ini ke builder PiP untuk menunjukkan area aktivitas yang
terlihat setelah transisi ke PiP.
- Hanya tambahkan
setSourceRectHint()kebuilderjika status menentukan bahwa aplikasi harus memasuki mode PiP. Hal ini menghindari penghitungansourceRectsaat aplikasi tidak perlu memasuki PiP. - Untuk menetapkan nilai
sourceRect, gunakanlayoutCoordinatesyang diberikan dari fungsionGloballyPositionedpada pengubah. - Panggil
setSourceRectHint()padabuilderdan teruskan variabelsourceRect.
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)