【问题标题】:How do I create a Jetpack Compose Image that resizes automatically based on a remotely loaded image size?如何创建基于远程加载的图像大小自动调整大小的 Jetpack Compose 图像?
【发布时间】:2021-08-19 13:19:25
【问题描述】:

我想显示具有以下规则的图像:

  • 图像是远程的,需要在运行时加载。
  • 在加载之前,我们不知道图片的大小。
  • Image 视图应占父视图的全部宽度,并应自动调整其高度以匹配远程加载的图像,以免发生裁剪/拉伸。

我尝试使用Coil dependency,我有这个代码:

Image(
    painter = rememberImagePainter(viewModel.fullImageUrl),
    contentDescription = null,
    contentScale = ContentScale.FillHeight,
    modifier = Modifier
        .fillMaxWidth()
        .aspectRatio(3.21428f) // TODO: Figure out how to set height/ratio based on image itself
)

当我删除ImagecontentScalemodifier 时,它的高度似乎总是为零。我不确定我应该怎么做才能使Image 填充其父级的最大宽度,同时在 Coil 加载图像文件后确定其自身的大小。

【问题讨论】:

    标签: android android-jetpack-compose coil


    【解决方案1】:

    当您使用fillMaxWidth 设置灵活宽度时,您需要将ContentScale.FillWidth 用于您的contentScale

    Image(
        painter = rememberImagePainter(
            "https://via.placeholder.com/300.png",
        ),
        contentDescription = null,
        contentScale = ContentScale.FillWidth,
        modifier = Modifier
            .fillMaxWidth()
    )
    

    如果您的图像具有足够的优先级,以下将正常工作。但在某些情况下,coil 不会开始加载,因为它会认为图像大小为零,因此无需显示它。对于这种情况,您可以将size(OriginalSize) 参数添加到构建器:

    rememberImagePainter(
        "https://via.placeholder.com/300.png",
        builder = {
            size(OriginalSize)
        }
    )
    

    此参数使您的视图下载并放入图像的完整大小的内存中,而不针对当前视图进行优化。所以小心使用它,只有在你确定图片不会太大并且你真的不能添加使用尺寸修饰符的情况下。


    如果图片正在加载但仍然没有占用足够的空间,您可以像这样设置纵横比:

    val painter = rememberImagePainter("https://via.placeholder.com/300.png")
    Image(
        painter = painter,
        contentDescription = null,
        contentScale = ContentScale.Fit,
        modifier = Modifier
            .fillMaxWidth()
            .then(
                (painter.state as? ImagePainter.State.Success)
                    ?.painter
                    ?.intrinsicSize
                    ?.let { intrinsicSize ->
                        Modifier.aspectRatio(intrinsicSize.width / intrinsicSize.height)
                    } ?: Modifier
            )
    )
    

    如果这些都没有帮助并且painter.state 没有从Empty 更改,请尝试硬编码高度?: Modifier.height(10.dp) 以让图像开始加载

    【讨论】:

    • @Eugene 看起来你还没有尝试过我对builder = { size(OriginalSize) } 的最新建议,这对你有用
    • 这个解决方案也对我有用。请记住,它应该被视为临时解决方案。此参数使您的视图下载并放入图像的完整大小的内存中,而不针对当前视图对其进行优化所以请谨慎使用,只有在您确定图像不会太大并且您确实无法添加的情况下使用尺寸修饰符。
    • @SerhiiTereshchenko 感谢您的澄清,我在回复中添加了该信息。
    • ContentScale.FillWidth 也会降低图像的高度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2011-02-18
    • 2015-12-29
    相关资源
    最近更新 更多