Giới thiệu về chế độ hình trong hình (PiP)

Hình trong hình (PiP) là một loại chế độ nhiều cửa sổ đặc biệt, chủ yếu dùng để phát video. Tính năng này cho phép người dùng xem video trong một cửa sổ nhỏ được ghim vào góc màn hình trong khi di chuyển giữa các ứng dụng hoặc duyệt xem nội dung trên màn hình chính.

PiP tận dụng các API nhiều cửa sổ có trong Android 7.0 để cung cấp cửa sổ lớp phủ của video đã ghim. Để thêm PiP vào ứng dụng, bạn cần đăng ký hoạt động, chuyển hoạt động sang chế độ PiP (nếu cần) và đảm bảo ẩn đi các phần tử trên giao diện người dùng cũng như tiếp tục phát video khi hoạt động đó ở chế độ PiP.

使用 Jetpack 实现 PiP

使用 Jetpack 画中画库来实现画中画体验,因为它可以简化集成并减少常见的应用内问题。如需查看其使用示例,请参阅我们的平台示例应用。不过,如果您希望使用平台 API 实现 PiP,请参阅以下文档。

Xử lý giao diện người dùng ở chế độ PiP

Khi bạn chuyển sang chế độ PiP, toàn bộ giao diện người dùng của ứng dụng sẽ chuyển sang cửa sổ PiP, trừ phi bạn chỉ định giao diện người dùng sẽ trông như thế nào khi ở trong và ngoài chế độ PiP.

Trước tiên, bạn cần biết khi nào ứng dụng của mình ở chế độ PiP. Bạn có thể sử dụng OnPictureInPictureModeChangedProvider để thực hiện việc này. Đoạn mã sau đây kiểm tra xem ứng dụng của bạn có đang ở chế độ PiP hay không.

@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
    }
}

Giờ đây, bạn có thể sử dụng rememberIsInPipMode() để bật/tắt các phần tử trên giao diện người dùng sẽ hiển thị khi ứng dụng chuyển sang chế độ 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()
}