О картинке в картинке (PiP)

Режим «картинка в картинке» (PiP) — это особый тип многооконного режима, используемый в основном для воспроизведения видео. Он позволяет пользователю смотреть видео в небольшом окне, закрепленном в углу экрана, одновременно переключаясь между приложениями или просматривая контент на главном экране.

Функция PiP использует API многооконного режима, доступные в Android 7.0, для отображения закрепленного окна с видео. Чтобы добавить PiP в ваше приложение, необходимо зарегистрировать активность, переключать активность в режим PiP по мере необходимости и убедиться, что элементы пользовательского интерфейса скрыты, а воспроизведение видео продолжается, когда активность находится в режиме PiP.

使用 Jetpack 实现 PiP

使用 Jetpack 画中画库来实现画中画体验,因为它可以简化集成并减少常见的应用内问题。如需查看其使用示例,请参阅我们的平台示例应用。不过,如果您希望使用平台 API 实现 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()
}

,

Режим «картинка в картинке» (PiP) — это особый тип многооконного режима, используемый в основном для воспроизведения видео. Он позволяет пользователю смотреть видео в небольшом окне, закрепленном в углу экрана, одновременно переключаясь между приложениями или просматривая контент на главном экране.

Функция PiP использует API многооконного режима, доступные в Android 7.0, для отображения закрепленного окна с видео. Чтобы добавить PiP в ваше приложение, необходимо зарегистрировать активность, переключать активность в режим PiP по мере необходимости и убедиться, что элементы пользовательского интерфейса скрыты, а воспроизведение видео продолжается, когда активность находится в режиме PiP.

使用 Jetpack 实现 PiP

使用 Jetpack 画中画库来实现画中画体验,因为它可以简化集成并减少常见的应用内问题。如需查看其使用示例,请参阅我们的平台示例应用。不过,如果您希望使用平台 API 实现 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()
}