Informacje o obrazie w obrazie (PiP)

Obraz w obrazie (PIP) to specjalny rodzaj trybu wielu okien, który jest najczęściej używany do odtwarzania filmów. Pozwala użytkownikowi oglądać film w małym oknie przypiętym do rogu ekranu, a jednocześnie przełączać inne aplikacje lub wyszukiwać treści na głównym ekranie.

Tryb obrazu w obrazie korzysta z interfejsów API obsługujących wiele okien, które są dostępne w Androidzie 7.0, aby wyświetlać przypięte okno nakładki wideo. Aby dodać do aplikacji tryb obrazu w obrazie, musisz zarejestrować aktywność, w razie potrzeby przełączyć ją w tryb obrazu w obrazie i upewnić się, że elementy interfejsu są ukryte, a odtwarzanie wideo jest kontynuowane, gdy aktywność jest w trybie obrazu w obrazie.

Implement PiP with Jetpack

Use the Jetpack Picture-in-Picture library to implement picture-in-picture experience as it streamlines integration and reduces common in-app issues. Refer to our platform sample app to see an example of its usage. However, if you prefer to implement PiP using the platform APIs, refer to the following documentation.

Obsługa interfejsu w trybie obrazu w obrazie

Gdy przejdziesz do trybu PIP, cały interfejs aplikacji pojawi się w oknie PIP, chyba że określisz, jak ma wyglądać interfejs w tym trybie i poza nim.

Najpierw musisz wiedzieć, kiedy aplikacja jest w trybie obrazu w obrazie, a kiedy nie. Możesz to zrobić za pomocą elementu OnPictureInPictureModeChangedProvider. Poniższy kod informuje, czy aplikacja jest w trybie obrazu w obrazie.

@Composable
fun rememberIsInPipMode(): Boolean {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val activity = LocalContext.current.findActivity()
        var pipMode by remember { mutableStateOf(activity.isInPictureInPictureMode) }
        DisposableEffect(activity) {
            val observer = Consumer<PictureInPictureModeChangedInfo> { info ->
                pipMode = info.isInPictureInPictureMode
            }
            activity.addOnPictureInPictureModeChangedListener(
                observer
            )
            onDispose { activity.removeOnPictureInPictureModeChangedListener(observer) }
        }
        return pipMode
    } else {
        return false
    }
}

Teraz możesz użyć rememberIsInPipMode(), aby przełączać elementy interfejsu, które mają być wyświetlane, gdy aplikacja przechodzi w tryb obrazu w obrazie:

val inPipMode = rememberIsInPipMode()

Column(modifier = modifier) {
    // This text will only show up when the app is not in PiP mode
    if (!inPipMode) {
        Text(
            text = "Picture in Picture",
        )
    }
    VideoPlayer()
}