Aplikacja nie powinna przechodzić w tryb obrazu w pliku w tych sytuacjach:
- czy film jest zatrzymany lub wstrzymany.
- Jeśli jesteś na innej stronie aplikacji niż odtwarzacz wideo.
Aby kontrolować, kiedy aplikacja przechodzi w tryb PiP, dodaj zmienną, która śledzi stan odtwarzacza za pomocą mutableStateOf
.
przełączać stan w zależności od tego, czy odtwarzany jest film;
Aby przełączać stan w zależności od tego, czy odtwarzacz wideo odtwarza film, dodaj w odtwarzaczu listenera. Przełącz stan zmiennej stanu w zależności od tego, czy gracz gra:
player.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { shouldEnterPipMode = isPlaying } })
Przełącz stan w zależności od tego, czy gracz jest zwolniony
Gdy odtwarzacz zostanie uwolniony, ustaw zmienną stanu na false
:
fun releasePlayer() { shouldEnterPipMode = false }
Użyj stanu, aby określić, czy włączono tryb obrazu w obrazie (w wersji Androida 12 lub starszej)
- Dodawanie PiP w wersji 12 wymaga użycia zmiennej
DisposableEffect
, więc musisz utworzyć nową zmiennąrememberUpdatedState
, w której zmienną stanu jestnewValue
. Dzięki temu w ramachDisposableEffect
zostanie użyta zaktualizowana wersja. W funkcji lambda, która definiuje działanie po wywołaniu funkcji
OnUserLeaveHintListener
, dodaj instrukcjęif
z wartością zmiennej stanu wokół wywołania funkcjienterPictureInPictureMode()
: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") }
Użycie stanu do określenia, czy włączono tryb PiP (po Androidzie 12)
Przekazuj zmienną stanu do funkcji setAutoEnterEnabled
, aby aplikacja wchodziła w tryb PiP tylko we właściwym momencie:
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)
Użyj setSourceRectHint
, aby zastosować płynną animację
Interfejs API setSourceRectHint
tworzy płynniejszą animację podczas włączania trybu PiP. W Androidzie 12 i nowszych wersjach powoduje też płynniejszą animację podczas zamykania okna PiP.
Dodaj ten interfejs API do kreatora PiP, aby wskazać obszar aktywności, który jest widoczny po przejściu do PiP.
- Dodaj
setSourceRectHint()
dobuilder
tylko wtedy, gdy stan określa, że aplikacja powinna przejść do trybu PiP. Dzięki temu nie trzeba obliczaćsourceRect
, gdy aplikacja nie musi uruchamiać trybu PiP. - Aby ustawić wartość
sourceRect
, użyj wartościlayoutCoordinates
z funkcjionGloballyPositioned
w modyfikatorze. - Wywołaj metodę
setSourceRectHint()
obiektubuilder
i przekaż zmienną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)