出于各种原因,Text
的高度应始终至少等于x
行文本,无论其文本行是否少于x行。Text
和BasicText
合成对象只有maxLines
参数,而没有minLines
参数
我尝试了以下方法(x = 3):
Text(
modifier = Modifier.sizeIn(minHeight = with(LocalDensity.current) {
(42*3).sp.toDp()
}),
color = MaterialTheme.colors.onPrimary,
text = "Sample", textAlign = TextAlign.Center,
style = MaterialTheme.typography.h2 /* fontSize = 42 */,
lineHeight = 42.sp
)
结果高度小于文本包含3行时的高度
回到View World Android中,我们可以简单地使用minLines=3
,如何在Jetpack Compose中实现这一点?
6条答案
按热度按时间myss37ts1#
您的代码基本正确,只需将lineHeight设置为fontSize*4/3:
但是,您可以使用onTextLayout回调执行类似的操作,而无需计算:
uubf1zoe2#
当我们是waiting for Google implements this feature时,您可以使用此解决方法:
现在,不管字符串内容如何,
Text
都具有相同的高度:第一节第一节第一节第一节第二节第一节第三节第一节
此解决方案比基于
onTextLayout
中的线高计算Text
的底部偏移要容易得多(spoiler:开始、中心和最后一行具有不同高度)wtzytmuj3#
如果**
Text
的一个额外的重新组合**对您来说是合适的,您也可以使用Text
的onTextLayout
回调作为一种解决方案,直到Google官方支持最少行:这也将正确地工作与椭圆化和任何类型的字体填充,线高度样式等设置你的心的愿望。
“假”的4行文本(比如说,末尾有2个空行)的高度与“真实的的”4行文本(其中4行文本已被完全占用)相同。这一点通常非常重要,例如,在将多个
wrap_content
高度的卡片水平放置在文本旁边时(与maxLines
结合使用)应该决定卡片的高度,而所有卡片应该有相同的高度(而且它应该在常规的 * 和 * 高的语言中工作,比如缅甸语)。zdwk9cvp4#
下面是我提出的一个解决方案,它可以将高度设置为特定的行数(您可以修改修改器使其成为minLines)。它的灵感来自于compose SDK中的代码
有关此实现和其他选项的更多讨论,请参见:
https://kotlinlang.slack.com/archives/CJLTWPH7S/p1621789835172600
41zrol4v5#
从M2
1.4.0-alpha02
和M31.1.0-alpha02
开始,您可以在Text
中使用**minLines
**属性:注意,
minLines
是根据最小可见线数的最小高度。要求1 <= minLines <= maxLines
。您可以将其与M2和M3一起使用。
oo7oh9g96#
创建自定义文本
它在@Preview中不起作用,但在运行时
用法