2. 文本溢出与最大行数控制
maxLines 与 overflow 的配合关系
在 Compose 中,Text 的截断行为由两个参数共同决定:maxLines 限定最多显示多少行,overflow 决定超出部分如何处理。二者必须配合使用,单独设置 overflow 而不限制行数通常看不到截断效果。
maxLines = Int.MAX_VALUE(默认):不限制行数,文本会一直换行撑高容器。maxLines = 1/2/3...:超过指定行数后触发溢出策略。overflow = TextOverflow.Clip:直接裁掉超出部分,不显示省略号。overflow = TextOverflow.Ellipsis:在末尾用…表示被截断。overflow = TextOverflow.Visible:允许文字溢出到容器边界之外(需配合softWrap等使用)。
在固定宽度容器中验证三种策略
下面用同一段长文本、同一个固定宽度容器,分别设置三种 overflow 值,观察实际渲染差异。容器宽度设为 200.dp,maxLines 统一设为 2。
@Composable
fun OverflowDemo() {
val longText = "Compose 的 Text 组件支持多种溢出策略," +
"包括裁剪、省略号和溢出可见三种方式," +
"开发者可以根据界面需求灵活选择。"
Column(
modifier = Modifier.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
// 1. Clip:直接裁剪,无省略号
Text(
text = longText,
maxLines = 2,
overflow = TextOverflow.Clip,
modifier = Modifier.width(200.dp),
color = Color(0xFFB91C1C)
)
// 2. Ellipsis:末尾显示省略号
Text(
text = longText,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.width(200.dp),
color = Color(0xFF15803D)
)
// 3. Visible:允许文字溢出容器边界
Text(
text = longText,
maxLines = 2,
overflow = TextOverflow.Visible,
modifier = Modifier.width(200.dp),
color = Color(0xFF6D28D9)
)
}
}
结果判读与常见误区
| overflow 值 | maxLines=2 时的表现 | 典型使用场景 |
|---|---|---|
Clip |
第二行末尾被硬切,无任何提示符号 | 对视觉整洁度要求高、不需要提示截断 |
Ellipsis |
第二行末尾显示 …,提示内容未完整展示 |
列表项、卡片标题、摘要等需要提示截断的场景 |
Visible |
文字继续绘制到容器外,可能与其他组件重叠 | 特殊排版需求,需自行控制父容器裁剪 |
常见误区:只设置 overflow = TextOverflow.Ellipsis 而不设置 maxLines,文本会一直换行,永远不会触发省略号。必须同时限制行数,溢出策略才会生效。
验证技巧:将容器宽度从 200.dp 逐步缩小到 120.dp,观察 Ellipsis 策略下省略号出现的位置变化——它会始终保持在第二行末尾,而不是固定字符位置。