本頁說明如何設定段落文字的樣式。如要設定段落層級樣式,您可以設定 textAlign
和 lineHeight
等參數,或定義自己的 ParagraphStyle
。
設定文字對齊方式
textAlign
參數可讓您在 Text
可組合項介面區域內設定文字的水平對齊方式。
根據預設,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 才能運作)。對齊和剪輯會將文字行間測量到的空間,更妥善地分配至所有行,包括單行文字和文字區塊的頂行。
LineHeightStyle.Alignment
定義如何利用行高所提供的空間將行對齊。在每行中,您可以將文字與頂端、底部、置中或依比例對齊。LineHeightStyle.Trim
則允許您保留或移除文字第一行頂部和最後一行底部的額外空間,這些空間是由任何 lineHeight
和對齊調整所產生。以下範例顯示了置中對齊時 (LineHeightStyle.Alignment.Center
),多行文字搭配各種 LineHeightStyle.Trim
設定的樣式。
LineHeightStyle.Trim.None |
LineHeightStyle.Trim.Both |
LineHeightStyle.Trim.FirstLineTop |
LineHeightStyle.Trim.LastLineBottom |
請參閱「修正 Compose 文字中的字型邊框間距」網誌文章,進一步瞭解這項變更的背景資訊、includeFontPadding
在 View 系統中的運作方式,以及 Compose 的變更和新的 LineHeightStyle
API。
插入換行符號
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 ) ) } ) )
在上述輸出內容中,請注意 Paragraph
行破壞行為所產生的視覺平衡結果比 Simple
行破壞更多。
自訂換行符號
您也可以使用 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
。使用非 CJK 語言時,您不一定能看見這些 API 的效果。整體而言,換行規則是根據語言代碼所定義。
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 可讓您為應用程式加入連字號支援。連字號是指插入類似破折號的標點符號,讓字詞分行分割。啟用時,系統會在適當的連字號點之間,於字詞可切換之間加上連字號。
根據預設,系統不會啟用連字號。如要啟用連字號,請在 TextStyle
區塊中加入 Hyphens.Auto
做為參數:
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 版面配置中的內建函式測量資料