本页介绍了如何设置段落文本的样式。如需设置段落级样式,您可以配置 textAlign
和 lineHeight
等参数,也可以定义自己的 ParagraphStyle
。
设置文本对齐方式
借助 textAlign
参数,您可以在 Text
可组合项 Surface 区域内设置文本的水平对齐方式。
默认情况下,Text
会根据其内容值选择自然的文字对齐方式:
- 对于从左到右书写的文字,如拉丁语、西里尔文或朝鲜文,向
Text
容器的左边缘对齐 - 对于从右到左书写的文字,如阿拉伯语或希伯来语,向
Text
容器的右边缘对齐
@Composable fun CenterText() { Text( "Hello World", textAlign = TextAlign.Center, modifier = Modifier.width(150.dp) ) }
如果您要手动设置 Text
可组合项的文本对齐方式,最好分别使用 TextAlign.Start
和 TextAlign.End
(而不是 TextAlign.Left
和 TextAlign.Right
),因为它们会根据首选语言文本方向解析为 Text
可组合项的右边缘。例如,TextAlign.End
对于法语文字将向右侧对齐,而对于阿拉伯语文字则将向左侧对齐,但无论对于哪种文字,TextAlign.Right
都将向右侧对齐。
在段落中添加多种样式
如需在段落中添加多种样式,您可以在 AnnotatedString
中使用 ParagraphStyle
,它可以使用任意注解的样式进行注解。一旦用 ParagraphStyle
标记了一部分文本,该部分就会与其余文本分开,就像在开头和末尾有换行一样。
如需详细了解如何在文本中添加多种样式,请参阅在文本中添加多种样式。
AnnotatedString
具有类型安全的构建器,以便您更轻松地创建:buildAnnotatedString
。以下代码段使用 buildAnnotatedString
设置 ParagraphStyle
:
@Composable fun ParagraphStyle() { Text( buildAnnotatedString { withStyle(style = ParagraphStyle(lineHeight = 30.sp)) { withStyle(style = SpanStyle(color = Color.Blue)) { append("Hello\n") } withStyle( style = SpanStyle( fontWeight = FontWeight.Bold, color = Color.Red ) ) { append("World\n") } append("Compose") } } ) }
调整行高和内边距
includeFontPadding
是一个旧版属性,它根据第一行文字顶部和最后一行文字底部的字体指标添加额外的内边距。
从 Compose BOM 版本 2024.01.01
开始,includeFontPadding
默认设置为 false
,这会使默认文本布局与常用设计工具更为一致。
配置 lineHeight
的功能并不新鲜。从 Android Q 就开始提供此功能。您可以使用 lineHeight
参数为 Text
配置 lineHeight
,该参数可在每行文本中分布行高。然后,您可以使用新的 LineHeightStyle API
来进一步配置此文本的对齐方式,并移除空格。
为了提高精确度,您可能需要使用文本单位“em”(相对字体大小)而不是“sp”(缩放后的像素)来调整 lineHeight
。如需详细了解如何选择适当的文本单元,请参阅 TextUnit
。
Text( text = text, style = LocalTextStyle.current.merge( TextStyle( lineHeight = 2.5.em, platformStyle = PlatformTextStyle( includeFontPadding = false ), lineHeightStyle = LineHeightStyle( alignment = LineHeightStyle.Alignment.Center, trim = LineHeightStyle.Trim.None ) ) ) )
除了调整 lineHeight
之外,现在您还可以使用以下 LineHeightStyle
实验性 API LineHeightStyle.Alignment
和 LineHeightStyle.Trim
(includeFontPadding
必须设置为 false
,Trim 才能正常工作)的配置进一步居中和设置文本样式。Alignment 和 Trim 会使用在文本行之间测量到的空间,以便更合理地将其分配给所有行,包括单行文本和文本块的第一行。
LineHeightStyle.Alignment
定义了如何在行高提供的空间内对齐行。在每行中,您可以将文本与顶部、底部、中心或按比例对齐。然后,LineHeightStyle.Trim
可允许您从文本首行顶部或末行底部移除多余空格,这将通过任何 lineHeight
和 Alignment 调整生成。以下示例展示了当对齐居中时 (LineHeightStyle.Alignment.Center
),多行文本在各种 LineHeightStyle.Trim
配置下的外观。
LineHeightStyle.Trim.None |
LineHeightStyle.Trim.Both |
LineHeightStyle.Trim.FirstLineTop |
LineHeightStyle.Trim.LastLineBottom |
如需详细了解此变更的背景信息、includeFontPadding
在 View 系统中的工作原理,以及对 Compose 和新 LineHeightStyle
API 所做的更改,请参阅修复 Compose Text 中的字体内边距问题博文。
插入换行符
LineBreak
API 定义将文本拆分为多行的条件。您可以在 Text
可组合项的 TextStyle
代码块中指定所需的换行类型。预设的换行符类型包括:
Simple
- 快速、基本的换行。建议用于文本输入字段。Heading
- 使用较宽松的违规规则换行。建议用于标题等短文本。Paragraph
- 运行速度更慢、更优质的换行符,以提高可读性。 建议用于大量文字(例如段落)。
以下代码段使用 Simple
和 Paragraph
为一大段文本指定换行行为:
TextSample( samples = mapOf( "Simple" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(130.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = LineBreak.Simple ) ) }, "Paragraph" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(130.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = LineBreak.Paragraph ) ) } ) )
请注意,在上面的输出中,与 Simple
换行相比,Paragraph
换行行为生成的结果在视觉上更平衡。
自定义换行符
您还可以使用 Strategy
参数构建自己的 LineBreak
配置。Strategy
可以是以下任意一种:
Balanced
- 尝试平衡文本的行长度,如果已启用,则还会应用自动断字。建议用于手表等小屏幕设备,以便最大限度地增加显示的文本量。HighQuality
- 优化段落以获取可读性更强的文本,包括断字(如果已启用)。(除Balanced
或Simple
以外的所有内容都应为默认值。)Simple
- 基本的快速策略。启用后,系统只会对本身无法占满整行的字词进行断字。在编辑文本时非常有用,以免在输入时改变位置。
以下代码段展示了采用默认设置的段落与使用 Balanced
换行策略针对小屏幕进行了优化的段落之间的区别:
TextSample( samples = mapOf( "Balanced" to { val smallScreenAdaptedParagraph = LineBreak.Paragraph.copy(strategy = LineBreak.Strategy.Balanced) Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(200.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = smallScreenAdaptedParagraph ) ) }, "Default" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(200.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default ) } ) )
CJK 注意事项
您还可以使用 Strictness
和 WordBreak
API(专为 CJK 语言设计)自定义 LineBreak
。您有时可能并不能看到这些 API 在非 CJK 语言下的效果。总体而言,换行规则是根据语言区域定义的。
Strictness
通过以下属性描述了换行的严格程度:
Default
- 语言区域的默认破坏规则。可能对应于Normal
或Strict
。Loose
- 限制性最弱的规则。适合线条较短的用户。Normal
- 最常见的换行规则。Strict
- 最严格的换行规则。
WordBreak
定义了在具有以下属性的字词中插入换行符:
Default
- 语言区域的默认破坏规则。Phrase
- 换行基于词组。
以下代码段对日语文本使用了 Strict
严格程度和 Phrase
分词设置:
val customTitleLineBreak = LineBreak( strategy = LineBreak.Strategy.HighQuality, strictness = LineBreak.Strictness.Strict, wordBreak = LineBreak.WordBreak.Phrase ) Text( text = "あなたに寄り添う最先端のテクノロジー。", modifier = Modifier.width(250.dp), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = customTitleLineBreak ) )
将文本用连字符分隔成多行
Hyphens
API 可让您向应用添加断字支持。断字是指插入类似短划线的标点符号,以表明某个字词被拆分成多行文本。启用后,系统会在字词的音节之间在适当的连字符点处添加断字。
默认情况下,系统不会启用断字功能。如需启用断字功能,请将 Hyphens.Auto
作为参数添加到 TextStyle
块中:
TextSample( samples = mapOf( "Hyphens - None" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(130.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = LineBreak.Paragraph, hyphens = Hyphens.None ) ) }, "Hyphens - Auto" to { Text( text = SAMPLE_LONG_TEXT, modifier = Modifier .width(130.dp) .border(BorderStroke(1.dp, Color.Gray)), fontSize = 14.sp, style = TextStyle.Default.copy( lineBreak = LineBreak.Paragraph, hyphens = Hyphens.Auto ) ) } ) )
启用后,只有在以下条件下才会断字:
- 一个单词无法排成一行。如果使用
Simple
换行策略,则只有当一行短于单个字词时,才会在字词间断字。 - 系统会在您的设备上设置适当的语言区域,因为系统会根据系统中存在的字典确定适当的连字符。
为您推荐
- 注意:当 JavaScript 处于关闭状态时,系统会显示链接文字
- 设置文本样式
- Compose 布局基础知识
- Compose 布局中的固有特性测量