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.

Wdrażanie obrazu w obrazie za pomocą Jetpack

Użyj biblioteki Jetpack Picture-in-Picture, aby wdrożyć funkcję obrazu w obrazie. Ułatwia ona integrację i ogranicza typowe problemy w aplikacji. Przykład użycia znajdziesz w naszej przykładowej aplikacji na platformę. Jeśli jednak wolisz zaimplementować tryb obrazu w obrazie za pomocą interfejsów API platformy, zapoznaj się z tą dokumentacją.

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()
}