Что такое режим "Картинка в картинке" (PIP)

"Картинка в картинке" – это особый тип многооконного режима, который в основном используется для воспроизведения видео. Она позволяет смотреть видео в маленьком окне, прикрепленном к углу экрана, во время поиска контента или работы на устройстве.

Для создания закрепленного окна с видео в режиме "картинка в картинке" используются API многооконного режима, доступные в Android 7.0. Чтобы добавить режим "Картинка в картинке" в приложение, необходимо зарегистрировать объект activity, переключить его в режим "Картинка в картинке", а также убедиться, что элементы интерфейса скрыты и воспроизведение видео продолжается, когда объект activity находится в режиме "Картинка в картинке".

Реализация режима «картинка в картинке» с помощью Jetpack.

Используйте библиотеку Jetpack Picture-in-Picture для реализации режима «картинка в картинке», поскольку она упрощает интеграцию и уменьшает количество распространенных проблем в приложениях. Пример использования можно увидеть в нашем демонстрационном приложении . Однако, если вы предпочитаете реализовать PiP с помощью API платформы, обратитесь к следующей документации.

,

Реализация режима «картинка в картинке» с помощью Jetpack.

Используйте библиотеку Jetpack Picture-in-Picture для реализации режима «картинка в картинке», поскольку она упрощает интеграцию и уменьшает количество распространенных проблем в приложениях. Пример использования можно увидеть в нашем демонстрационном приложении . Однако, если вы предпочитаете реализовать PiP с помощью API платформы, обратитесь к следующей документации.

Как управлять интерфейсом в режиме "Картинка в картинке"

При переходе в режим PiP весь пользовательский интерфейс вашего приложения переходит в окно PiP, если вы не укажете, как ваш пользовательский интерфейс должен выглядеть в режиме PiP и вне его.

Сначала нужно определить, находится ли приложение в режиме "Картинка в картинке". Для этого можно использовать OnPictureInPictureModeChangedProvider. Следующий код позволяет проверить, находится ли приложение в режиме "Картинка в картинке".

@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(), чтобы выбирать, какие элементы интерфейса показывать, когда приложение переходит в режим "Картинка в картинке":

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