Obraz w obrazie (PiP) to specjalny typ trybu wielu okien, który jest używany głównie do odtwarzania filmów. Pozwala on 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 wykorzystuje interfejsy API wielu okien dostępne w Androidzie 7.0, aby wyświetlać przypięte okno nakładki wideo. Aby dodać tryb obrazu w obrazie do aplikacji, musisz zarejestrować aktywność, przełączyć ją w tryb obrazu w obrazie, gdy jest to konieczne, i upewnić się, że elementy interfejsu są ukryte, a odtwarzanie filmu 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 włączysz tryb obrazu w obrazie, cały interfejs aplikacji zostanie wyświetlony w oknie obrazu w obrazie, chyba że określisz, jak interfejs ma wyglądać w trybie obrazu w obrazie i poza nim.
Najpierw musisz wiedzieć, kiedy aplikacja jest w trybie obrazu w obrazie. Możesz to zrobić za pomocą OnPictureInPictureModeChangedProvider.
Poniższy kod sprawdza, 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() }