android 图像使用“滑动/螺旋”将位图转换为画布

1u4esq0p  于 2022-11-20  发布在  Android
关注(0)|答案(2)|浏览(162)

我使用的是@Composable,需要通过参数传递ImageBitmap,问题是,我从服务器获取图像时需要给定一个url,因此我需要加载这些图像,将其转换为Bitmap,然后再转换为ImageBitmap,但我遇到了麻烦,因为我不知道如何将其转换为ImageBitmap,这是我的@Composable

@ExperimentalComposeUiApi
@Composable
fun MyCanvas(
    myImage: ImageBitmap,
    modifier: Modifier = Modifier,
) {
    Canvas(modifier = modifier
        .size(220.dp)
        .clipToBounds()
        .clip(RoundedCornerShape(size = 16.dp)) {

        ...
        val canvasWidth = size.width.toInt()
        val canvasHeight = size.height.toInt()
        val imageSize = IntSize(width = canvasWidth, height = canvasHeight)

        drawImage(
            image = myImage, dstSize = imageSize
        )
        ...
    }
}

因此,当我调用这个@Composable时,我需要加载图像,但不知道如何开始,我需要知道使用Glide或Coil哪个更好。

noj0wjuj

noj0wjuj1#

您不需要ImageBitmap就可以将其绘制到Canvas中您可以在DrawScope中绘制绘图器您甚至不需要Canvas函数androidx.compose.foundation.Canvas就是带有Modifier.drawBehind Spacer

@Composable
fun Canvas(modifier: Modifier, onDraw: DrawScope.() -> Unit) =
    Spacer(modifier.drawBehind(onDraw))

您问题答案是

@Composable
private fun MyComposable() {
    val sizeModifier = Modifier
        .fillMaxWidth()

    val url =
        "https://avatars3.githubusercontent.com/u/35650605?s=400&u=058086fd5c263f50f2fbe98ed24b5fbb7d437a4e&v=4"

    Column(
        modifier =Modifier.fillMaxSize()
    ) {

      val painter =  rememberAsyncImagePainter(
            model = url
        )

        Canvas(modifier = Modifier
            .clip(RoundedCornerShape(size = 16.dp))
                .size(220.dp)
            ) {
                with(painter) {
                    draw(size = size)
                }
            }

    }
}

当您应用Modifier.clip()时,您不必应用Modifier.clipToBounds()
这两种方法是相同的,clip使用额外的形状来clipToBounds

/**
 * Clip the content to the bounds of a layer defined at this modifier.
 */
@Stable
fun Modifier.clipToBounds() = graphicsLayer(clip = true)

/**
 * Clip the content to [shape].
 *
 * @param shape the content will be clipped to this [Shape].
 */
@Stable
fun Modifier.clip(shape: Shape) = graphicsLayer(shape = shape, clip = true)
lf5gs5x2

lf5gs5x22#

很明显,瑟瑞斯博士提供了一个最佳的解决方案,这是他从他几个世纪的治疗病态代码的经验中提取出来的。你可以接受。但是,从你在问题中提供的描述来看,看起来你所需要的只是一种将Bitmap转换为ImageBitmap对象的方法。这是一个非常方便的asImageBitmap()扩展函数,现在可以和位图一起使用了。
就Glide和Coil而言,两者都有流行的API方法,我认为它们达到了类似的目标/性能。现在,就我所记得的,Coil是第一个迁移到Compose的。我只使用Coil,因为我需要从URL中获取图像,并希望简单地显示它,所以Coil为此提供了一个非常直接的API。rememberCoilPainter(),它的工作原理类似于重力。我还没有真正使用过另一个,只是在谷歌上搜索一下两者的比较。它绝对是可用的,或者只是通过两者的文档来看看哪些方法是可用的,并在这样做的同时在你的脑海中设计你的代码结构;选择一个更容易实现的。这个网站通常不用于听取意见,所以我就把它留在那里。不错的技巧可能是-文档越好,API就越好。

相关问题