gpt4 book ai didi

android - Jetpack Compose 将 PorterDuffMode 应用于图像

转载 作者:行者123 更新时间:2023-12-04 23:44:28 24 4
gpt4 key购买 nike

基于 this page 中的图像和 PorterDuffModes
我下载了图像,最初即使它们是 png 他们有不透明的浅灰色和深灰色矩形并将它们删除。
Destination Source
并使用 this sample code checkout ,用下面的原始代码替换drawables,我得到结果
enter image description here
看起来它可以与 Android View 一起使用,但是当我使用 Jetpack Canvas 作为

androidx.compose.foundation.Canvas(modifier = Modifier.size(500.dp),
onDraw = {

drawImage(imageBitmapDst)
drawImage(imageBitmapSrc, blendMode = BlendMode.SrcIn)

})
BlendMode.SrcIn 在黑色矩形上绘制蓝色矩形,其他模式也不会返回正确的结果。 BlendMode.SrcOut 返回黑屏。
并使用 Box 堆叠在一起的 2 个图像
val imageBitmapSrc: ImageBitmap = imageResource(id = R.drawable.c_src)
val imageBitmapDst: ImageBitmap = imageResource(id = R.drawable.c_dst)

Box {
Image(bitmap = imageBitmapSrc)
Image(
bitmap = imageBitmapDst,
colorFilter = ColorFilter(color = Color.Unspecified, blendMode = BlendMode.SrcOut)
)
}
只有蓝色的 src 矩形是可见的。
还尝试了 Painter , 也不能让它工作
val imageBitmapSrc: ImageBitmap = imageResource(id = R.drawable.c_src)
val imageBitmapDst: ImageBitmap = imageResource(id = R.drawable.c_dst)

val blendPainter = remember {
object : Painter() {

override val intrinsicSize: Size
get() = Size(imageBitmapSrc.width.toFloat(), imageBitmapSrc.height.toFloat())

override fun DrawScope.onDraw() {
drawImage(imageBitmapDst, blendMode = BlendMode.SrcOut)
drawImage(imageBitmapSrc)
}
}
}

Image(blendPainter)
应该如何 BlendPorterDuff模式可以与 Jetpack Compose 一起使用吗?

最佳答案

整整一周我都因类似的问题而感到沮丧,但是您的问题帮助我找到了解决方案如何使其发挥作用。
编辑1
我正在使用撰写 1.0.0就我而言,我使用的是双缓冲之类的东西,而不是直接在 Canvas 上绘图 - 只是作为一种解决方法。

Canvas(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {

// First I create bitmap with real canva size
val bitmap = ImageBitmap(size.width.toInt(), size.height.toInt())

// here I'm creating canvas of my bitmap
Canvas(bitmap).apply {
// here I'm driving on canvas
}

// here I'm drawing my buffered image
drawImage(bitmap)
}
内部 Canvas(bitmap)我正在使用 drawPath , drawText等与油漆:
val colorPaint = Paint().apply {
color = Color.Red
blendMode = BlendMode.SrcAtop
}
并以这种方式 BlendMode工作正常 - 我尝试了许多模式,一切都按预期工作。
我不知道为什么这不能直接在 Composable 的 Canvas 上工作,但我的解决方法对我来说很好。
编辑2
在调查了 Image's Painter 的源代码后,我看到 Android 团队也使用 alpha 技巧来决定是否创建图层
Painter
private fun configureAlpha(alpha: Float) {
if (this.alpha != alpha) {
val consumed = applyAlpha(alpha)
if (!consumed) {
if (alpha == DefaultAlpha) {
// Only update the paint parameter if we had it allocated before
layerPaint?.alpha = alpha
useLayer = false
} else {
obtainPaint().alpha = alpha
useLayer = true
}
}
this.alpha = alpha
}
}
并适用于此
    fun DrawScope.draw(
size: Size,
alpha: Float = DefaultAlpha,
colorFilter: ColorFilter? = null
) {
configureAlpha(alpha)
configureColorFilter(colorFilter)
configureLayoutDirection(layoutDirection)

// b/156512437 to expose saveLayer on DrawScope
inset(
left = 0.0f,
top = 0.0f,
right = this.size.width - size.width,
bottom = this.size.height - size.height
) {

if (alpha > 0.0f && size.width > 0 && size.height > 0) {
if (useLayer) {
val layerRect = Rect(Offset.Zero, Size(size.width, size.height))
// TODO (b/154550724) njawad replace with RenderNode/Layer API usage
drawIntoCanvas { canvas ->
canvas.withSaveLayer(layerRect, obtainPaint()) {
onDraw()
}
}
} else {
onDraw()
}
}
}
}
}

关于android - Jetpack Compose 将 PorterDuffMode 应用于图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65653560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com