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 等使用)。
固定宽度容器内 maxLines × overflow 显示结果 原始长文本 "Compose 的 Text 组件 支持多种溢出策略…" 参数组合 maxLines = 2 overflow = ? Clip(裁剪) Compose 的 Text 组件 支持多种溢出策略 (无省略号,直接截断) Ellipsis(省略号) Compose 的 Text 组件 支持多种溢出策略… (末尾显示 …) Visible(溢出可见) Compose 的 Text 组件 支持多种溢出策略 (文字溢出容器边界) 关键规则:overflow 仅在 maxLines 限制生效时起作用;maxLines 默认 Int.MAX_VALUE 时不会触发截断。 固定宽度容器中,文本先按宽度换行,再按 maxLines 截断,最后按 overflow 决定末尾显示方式。

在固定宽度容器中验证三种策略

下面用同一段长文本、同一个固定宽度容器,分别设置三种 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 策略下省略号出现的位置变化——它会始终保持在第二行末尾,而不是固定字符位置。