Wprowadzanie PiP we właściwych momentach

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)

  1. Dodawanie PiP w wersji 12 wymaga użycia zmiennej DisposableEffect, więc musisz utworzyć nową zmienną rememberUpdatedState, w której zmienną stanu jest newValue. Dzięki temu w ramach DisposableEffect zostanie użyta zaktualizowana wersja.
  2. W funkcji lambda, która definiuje działanie po wywołaniu funkcji OnUserLeaveHintListener, dodaj instrukcję if z wartością zmiennej stanu wokół wywołania funkcji enterPictureInPictureMode():

    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.

  1. Dodaj setSourceRectHint() do builder 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.
  2. Aby ustawić wartość sourceRect, użyj wartości layoutCoordinates z funkcji onGloballyPositioned w modyfikatorze.
  3. Wywołaj metodę setSourceRectHint() obiektu builder 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)