Android Compose:在图像上绘制透明圆圈

Dem*_*god 9 android android-jetpack-compose

我有一个图像,我想在它上面绘制一个带有透明圆圈的深色矩形,所以结果将是这样的: https://www.google.com/url?sa=i&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F36763696%2Fhow-to-create-a-transparent-circle-inside-rectangle-shape-in​​- xml-in-android&psig=AOvVaw18ZjvY-j8QyYzFw1xsmOdJ&ust=1630768957499000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCPD1mveN4_ICFQAAAAAdAAAAABAE

我最终得到了这段代码:

Box(modifier = Modifier
        .clip(RectangleShape)
        .fillMaxSize()
        .background(Color.Black)
        .pointerInput(Unit) {
            detectTransformGestures { centroid, pan, zoom, rotation ->
                scale *= zoom
            }
        }) {
        Image(
            modifier = Modifier
                .align(Alignment.Center)
                .graphicsLayer(
                    scaleX = maxOf(.2f, minOf(5f, scale)),
                    scaleY = maxOf(.2f, minOf(5f, scale))
                ),
            bitmap = bitmap.asImageBitmap(),
            contentDescription = null
        )
        Canvas(modifier = Modifier.fillMaxSize(), onDraw = {
            drawRect(Color.Black.copy(alpha = 0.8f))
            drawCircle(
                Color.Transparent,
                style = Fill,
                blendMode = BlendMode.Clear
            )
        })
    }
Run Code Online (Sandbox Code Playgroud)

但它似乎只是在图像顶部画了一个黑圆圈,而不是清除变暗的矩形......

如果您建议如何根据此圆坐标裁剪图像,这也会非常方便。

Phi*_*hov 27

clipPath您可以与clipOp = ClipOp.Difference选项一起使用:

Canvas(modifier = Modifier.fillMaxSize()) {
    val circlePath = Path().apply {
        addOval(Rect(center, size.minDimension / 2))
    }
    clipPath(circlePath, clipOp = ClipOp.Difference) {
        drawRect(SolidColor(Color.Black.copy(alpha = 0.8f)))
    }
}
Run Code Online (Sandbox Code Playgroud)