在 Jetpack Compose 中将可组合视图转换为图像

Tal*_*bar 3 android kotlin android-jetpack-compose

例如,我有一个可组合项

Box(modifier){ ... }
Run Code Online (Sandbox Code Playgroud)

我想将此视图作为图像与其他应用程序共享,这就是为什么我必须将此 Box 转换为可以与其他应用程序(例如 WhatsApp 等)共享的图像。谢谢

Thr*_*ian 8

您可以查看此链接以了解如何构建自己的捕获系统

如何选择性地或可滚动地截屏可组合项?

你基本上可以使用查看

val view: View =  LocalView.current
Run Code Online (Sandbox Code Playgroud)

然后使用可组合项的位置

var composableBounds by remember {
    mutableStateOf<Rect?>(null)
}
Run Code Online (Sandbox Code Playgroud)

使用 onGloballyPositionedModifier

   Box(modifier = modifier
        .onGloballyPositioned {
            composableBounds = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                it.boundsInWindow()
            } else {
                it.boundsInRoot()
            }
        }
    ) {
        content()
    }
Run Code Online (Sandbox Code Playgroud)

然后使用捕获图像

val bitmap = Bitmap.createBitmap(
    width,
    height,
    Bitmap.Config.ARGB_8888
)
Run Code Online (Sandbox Code Playgroud)

PixelCopy,这很重要,如果你不在 Oreo 及以上版本上使用它,你可能会在某些设备上崩溃

 PixelCopy.request(
            (this.context as Activity).window,
            bounds.toAndroidRect(),
            bitmap)
Run Code Online (Sandbox Code Playgroud)

或者

    val canvas = Canvas(bitmap)
        .apply {
            translate(-bounds.left, -bounds.top)
        }
    this.draw(canvas)
    canvas.setBitmap(null)
    bitmapCallback.invoke(ImageResult.Success(bitmap))
Run Code Online (Sandbox Code Playgroud)

我还创建了一个库,可以在指定的时间间隔内截取屏幕截图或屏幕截图。

https://github.com/SmartToolFactory/Compose-Screenshot

我的和其他所有屏幕捕获库的问题是默认情况下无法捕获可滚动的可组合项。