android 如何在可绘制对象内部绘制图像,并将其边界限制在可绘制对象内

bwntbbo3  于 2023-03-27  发布在  Android
关注(0)|答案(1)|浏览(105)

经过大量的研究和尝试,我决定向你寻求帮助。
我有2个可绘制对象,我想合并成一个。
上面的那个应该限制在后面那个的形状上。
这是我的想法,但由于某些原因,上面那个透明的部分并不透明。
不要介意背景绘制的奇怪偏移量,我稍后会修正这个问题。
稍后我希望能够通过一个图像,并有它填补形状除了中风。但也许我可以添加中风后?

下面是代码:

@Composable
fun Avatar(backgroundDrawable: Int, avatarSize: Int = 80) {
    val imageBitmapDst =
        getBitmapFromImage(LocalContext.current, backgroundDrawable)
            .asImageBitmap()
    val imageBitmapSrc =
        getBitmapFromImage(LocalContext.current, R.drawable.default_avatar)
            .asImageBitmap()

    Canvas(modifier = Modifier.size(avatarSize.dp)) {
        val dimension = size.height.coerceAtMost(size.width) / 2f
        val xPos = (size.width - dimension) / 2f
        val yPos = (size.height - dimension) / 2f

        drawImage(
            image = imageBitmapDst,
        )

        drawImage(
            image = imageBitmapSrc,
            dstOffset = IntOffset(xPos.toInt(), yPos.toInt()),
            dstSize = IntSize(dimension.toInt(), dimension.toInt()),
            blendMode = BlendMode.SrcIn
        )
    }
}

我觉得我快到了,但我错过了一些东西。
提前感谢您的帮助!

2hh7jdfx

2hh7jdfx1#

您需要将Canvas的alpha设置为小于1f,或者使用一个层来应用Blend或Porter Duff模式。

with(drawContext.canvas.nativeCanvas) {
        val checkPoint = saveLayer(null, null)

    // Destination
     drawImage(
            image = imageBitmapDst,
        )

      // Source
        drawImage(
            image = imageBitmapSrc,
            dstOffset = IntOffset(xPos.toInt(), yPos.toInt()),
            dstSize = IntSize(dimension.toInt(), dimension.toInt()),
            blendMode = BlendMode.SrcIn
        )
    restoreToCount(checkPoint)
}

你可以参考这些问题和答案
https://stackoverflow.com/a/69790654/5457853
How to clip or cut a Composable?
https://stackoverflow.com/a/73996333/5457853

相关问题