我试图让一个图像占据容器的宽度,并根据图像的比例设置高度。在XML中,我会在ImageView上使用adjustViewBounds。在Compose中有类似的方法吗?如果没有,我该如何实现?
ImageView
adjustViewBounds
vktxenjb1#
SimpleImage已经过时,取而代之的是Image,后者更易于自定义--至少它允许设置修饰符。保持图像比率的基本思想保持不变:
SimpleImage
Image
val painter = painterResource(id = R.drawable.android_studio_logo) val imageRatio = painter.intrinsicSize.width / painter.intrinsicSize.height Image( painter = painter, contentDescription = null, modifier = Modifier .fillMaxWidth() .aspectRatio(imageRatio) )
我不认为像adjustViewBounds这样的东西目前在0.1.0-dev 06中是开箱即用的。通过查看源代码,SimpleImage似乎无法自定义,它所做的只是在Box上绘制与图像大小完全相同的图像:
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以图像的比率来调整高度:
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)
当然,为了更好的可重用性和可读性,我们可以将它 Package 在一个函数中。结果如下所示:
yhived7q2#
在版本1.0.0-alpha 06时,它与可接受的答案类似。例如,对于矢量资源,代码如下所示。
@Composable fun VectorImage(asset: VectorAsset) { val imageRatio = asset.defaultWidth.value / asset.defaultHeight.value Image( asset = asset, contentScale = ContentScale.Fit, modifier = Modifier.aspectRatio(imageRatio).fillMaxWidth() ) }
3wabscal3#
Image( painter = painterResource(id = R.drawable.test), contentDescription = "test", modifier = Modifier.fillMaxWidth(), contentScale = ContentScale.FillWidth )
3条答案
按热度按时间vktxenjb1#
更新合成1.0+
SimpleImage
已经过时,取而代之的是Image
,后者更易于自定义--至少它允许设置修饰符。保持图像比率的基本思想保持不变:0.1.0-dev 06的旧答案
我不认为像
adjustViewBounds
这样的东西目前在0.1.0-dev 06中是开箱即用的。通过查看源代码,
SimpleImage
似乎无法自定义,它所做的只是在Box
上绘制与图像大小完全相同的图像:但是基于该实现,类似
adjustViewBounds
的效果可以通过使用不同的大小修改器来实现。代替特定的精确大小,我们可以应用LayoutWidth.Fill
来占据整个宽度,然后使用LayoutAspectRatio
以图像的比率来调整高度:当然,为了更好的可重用性和可读性,我们可以将它 Package 在一个函数中。
结果如下所示:
yhived7q2#
在版本1.0.0-alpha 06时,它与可接受的答案类似。
例如,对于矢量资源,代码如下所示。
3wabscal3#