我有以下的组合。
@Composable
fun Temp() {
Row(
modifier = Modifier
.background(Color.Red)
.height(IntrinsicSize.Min)
.fillMaxWidth()
) {
Text(text = "Hello", fontSize = 10.sp)
Icon(
imageVector = Icons.Default.Star,
contentDescription = "Star",
modifier = Modifier.fillMaxHeight()
)
}
}
图标的高度没有从24.dp开始降低。有什么方法可以实现这种行为我。我希望图标大小只是父行的高度。如果文本很大。图标的大小增加。我认为它必须与图标的最小尺寸为24.dp。如何让图标变小?
2条答案
按热度按时间kkih6yb81#
您的代码实际上按预期工作-这就是内在计算的工作方式。
Compose检查每个视图的最小高度并选择这些值中的最大值。在您的例子中,图像的最小高度与图像的固有大小有关,在
Icons.Default
的例子中,您无法控制它。一个可能的解决方案是使用
Modifier.layout
。当Compose计算固有高度时,高度约束将是无限的,在这种情况下,您可以将其布局为零大小视图,以便您的文本将是最高的。确定固有高度后,可以测量和定位图标:使用
Modifier.layout
可以更改视图的大小及其位置。通常你是这样使用它的:1.第一个参数
measurable
是一个对象,您可以在其上使用constraints
(第二个layout
参数)调用measure
。measure
将计算视图的大小,并将constraints
作为计数。1.在
layout
中,你需要传递所需的视图大小-通常可以从上一步的placeable
中获取。1.在
layout
内部,您需要使用所需的偏移量在placeable
上调用place
。使用
height(IntrinsicSize.Min)
layout
时,内容会被多次调用:1.在第一次调用期间,max_height_constraint等于
Infinity
,因此固有计算可以选择正确的大小,忽略父大小。1.在最后一次调用中,最大高度约束等于计算的父固有高度。
在第一次调用的代码中,当height constraint等于
Infinity
时,我说这个视图的大小为零,所以它不计入内部度量。定义了固有高度后,我可以使用最终约束对其进行布局。fnvucqvd2#
我接受了@Phil的答案,并将其转换为可以重用的扩展。
它可以像这样在你的图标中使用: