2

我正在尝试使图像占据容器宽度并根据图像比例具有高度。在 XML 中,我会使用adjustViewBoundson ImageView。Compose 中有类似物吗?如果没有,我怎样才能做到这一点?

4

2 回答 2

5

0.1.0-dev09 更新

SimpleImage已弃用并取而代之的Image是更可定制的-至少它允许设置修饰符。保持图像比例的总体思路保持不变:

val image = imageResource(R.drawable.android_studio_logo)
val imageRatio = image.width.toFloat() / image.height.toFloat()
Image(
    image = image,
    contentScale = ContentScale.Crop,
    modifier = LayoutWidth.Fill + LayoutAspectRatio(imageRatio)
)

0.1.0-dev06 的旧答案

我认为adjustViewBounds目前在 0.1.0-dev06 中不支持开箱即用的东西。

通过查看源代码,SimpleImage似乎无法自定义。它所做的只是在Box与图像完全相同的大小上绘制图像:

@Composable
fun SimpleImage(
    image: Image,
    tint: Color? = null
) {
    with(DensityAmbient.current) {
        val imageModifier = ImagePainter(image).toModifier(
            scaleFit = ScaleFit.FillMaxDimension,
            colorFilter = tint?.let { ColorFilter(it, BlendMode.srcIn) }
        )
        Box(LayoutSize(image.width.toDp(), image.height.toDp()) + ClipModifier + imageModifier)
    }
}

但是基于该实现,adjustViewBounds可以通过使用不同的大小修饰符来实现类似的效果。我们可以应用而不是特定的确切尺寸LayoutWidth.Fill来占据整个宽度,然后使用LayoutAspectRatio图像的比例调整高度:

val image = imageResource(R.drawable.android_studio_logo)
val imageRatio = image.width.toFloat() / image.height.toFloat()
val imageModifier = ImagePainter(image).toModifier(scaleFit = ScaleFit.FillMaxDimension)
Box(LayoutWidth.Fill + LayoutAspectRatio(imageRatio) + imageModifier)

当然,为了更好的可重用性和可读性,我们可以将它包装在一个函数中。
结果如下所示:

预览对比

于 2020-03-12T09:44:51.507 回答
0

在版本 1.0.0-alpha06 时,它类似于接受的答案。

例如,对于矢量资源,代码如下。

@Composable
fun VectorImage(asset: VectorAsset) {
    val imageRatio = asset.defaultWidth.value / asset.defaultHeight.value
    Image(
        asset = asset,
        contentScale = ContentScale.Fit,
        modifier = Modifier.aspectRatio(imageRatio).fillMaxWidth()
    )
}
于 2020-11-11T21:54:57.773 回答