zar*_*sky 4 android android-jetpack android-jetpack-compose
我正在尝试使图像占据容器宽度并根据图像比例具有高度。在 XML 中,我会使用adjustViewBounds
on ImageView
. Compose 中有类似的吗?如果没有,我怎样才能实现这一目标?
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)
)
Run Code Online (Sandbox Code Playgroud)
我认为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)
}
}
Run Code Online (Sandbox Code Playgroud)
但基于该实现,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)
Run Code Online (Sandbox Code Playgroud)
当然,为了更好的可重用性和可读性,我们可以将其包装在函数中。
结果如下:
归档时间: |
|
查看次数: |
4596 次 |
最近记录: |