«Картинка в картинке» (PiP) — это особый тип многооконного режима, который чаще всего используется для воспроизведения видео. Он позволяет пользователю смотреть видео в небольшом окне, закрепленном в углу экрана, одновременно перемещаясь между приложениями или просматривая контент на главном экране.
PiP использует многооконные API, доступные в Android 7.0, для обеспечения прикрепленного окна наложения видео. Чтобы добавить PiP в свое приложение, вам необходимо зарегистрировать свое действие, при необходимости переключить его в режим PiP и убедиться, что элементы пользовательского интерфейса скрыты и воспроизведение видео продолжается, когда действие находится в режиме PiP.
Управляйте своим пользовательским интерфейсом в режиме PiP
Когда вы входите в режим «картинка в картинке», весь пользовательский интерфейс вашего приложения переходит в окно «картинка в картинке», если вы не укажете, как ваш пользовательский интерфейс должен выглядеть в режиме «картинка в картинке» и из него.
Во-первых, вам нужно знать, находится ли ваше приложение в режиме PiP или нет. Для этого вы можете использовать OnPictureInPictureModeChangedProvider
. Код ниже сообщает вам, находится ли ваше приложение в режиме PiP.
@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 } }
Теперь вы можете использовать rememberIsInPipMode()
, чтобы переключать элементы пользовательского интерфейса, которые будут отображаться, когда приложение переходит в режим PiP:
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() }