樣式段落

本頁面說明如何設定段落文字樣式。如要設定段落層級樣式,您可以設定 textAlign 和 lineHeight 等參數,或定義自己的 ParagraphStyle。

設定文字對齊方式

textAlign 參數可讓您在 Text 可組合項介面區域中,設定文字的水平對齊方式。

根據預設,Text 會根據內容值選擇自然文字對齊方式:

  • Text 容器的左側邊緣為由左至右的字母,例如拉丁文、斯拉夫文或韓文
  • Text 容器的右側邊緣為由右至左的字母,例如阿拉伯文或希伯來文

@Composable
fun CenterText() {
    Text(
        "Hello World", textAlign = TextAlign.Center, modifier = Modifier.width(150.dnippets.kt

「

如要手動設定 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")
       }
    )
}TextSnippets.kt

三個段落分成三種樣式:藍色、紅色、粗體和純黑色

調整行高和邊框間距

includeFontPadding 是舊版屬性,會根據文字第一行頂端和最後一行的字型指標,新增額外的邊框間距。從 Compose BOM 2024.01.01 版開始,includeFontPadding 預設會設為 false,讓預設文字版面配置更符合常見設計工具。

設定 lineHeight 的功能並非全新功能,這項功能自 Android Q 起即可使用。您可以使用 lineHeight 參數將 Text 設定為 lineHeight,這會在每行文字中分配行高。然後,您就可以使用新的 LineHeightStyle API,進一步設定文字在聊天室中對齊的方式,並移除空白字元。

建議使用文字單位「em」(相對字型大小),而不使用「sp」(縮放像素) 來調整 lineHeight,以提升精確度。如要進一步瞭解如何選取適當的文字單元,請參閱 TextUnit。

圖片:lineHeight 是根據正上方和正下方線條測量而得。
圖 1. 使用對齊和剪輯功能調整 lineHeight 集合中的文字,並視需要修剪額外空間。

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,剪輯才能正常運作)。對齊和剪輯會將文字行間測量到的空間,更妥善地分配至所有行,包括單行文字和文字區塊的頂行文字。

LineHeightStyle.Alignment 定義如何利用行高所提供的空間將行對齊。在每行中,您可以將文字與頂端、底部、置中或依比例對齊。LineHeightStyle.Trim 則允許您保留或刪除文字第一行頂部和最後一行底部的額外空間,這些空間是由任何 lineHeight 和對齊調整所產生。以下範例顯示了置中對齊時 (LineHeightStyle.Alignment.Center),多行文字搭配各種 LineHeightStyle.Trim 設定的樣式。

示範 LineHeightStyle.Trim.None 的圖片 示範 LineHeightStyle.Trim.Both 的圖片
LineHeightStyle.Trim.None LineHeightStyle.Trim.Both
示範 LineHeightStyle.Trim.FirstLineTop 的圖片 示範 LineHeightStyle.Trim.LastLineBottom 的圖片
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
                )
             )
)TextSnippets.kt

顯示簡單換行策略的文字區塊,以及採用段落最佳化換行策略的文字區塊。採用簡單換行策略的文字區塊,行長度變化較大。
圖 1. 採用簡單換行策略的文字區塊 (上) 與採用段落最佳化換行的文字區塊 (下)。

在上述輸出內容中,請注意 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
             )
)TextSnippets.kt

採用平衡換行策略的段落,以及未採用策略格式化的段落。採用平衡換行策略的段落,行長度比預設策略更一致。
圖 2. 採用 Balanced 換行策略設定格式的段落 (頂端),以及未採用換行策略設定格式的段落。

中日韓注意事項

您也可以使用 Strictness 和 WordBreak API 自訂 LineBreak,這些 API 是專為中日韓語言設計。在非中日韓語言中,您不一定能看到這些 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 = customTitleLineBrenippets.kt

採用嚴格度和斷詞設定的日文文字與預設文字。
圖 3. 使用 Strictness 和 WordBreak 設定格式化的文字 (頂端),以及僅使用 LineBreak.Heading 格式化的文字 (底部)。

在跨行文字中加入連字號

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
                )
             )
)TextSnippets.kt

未啟用連字功能的段落和已啟用連字功能的段落。啟用連字功能後,系統會使用連字號將字詞拆成兩行。
圖 4. 未啟用連字功能的段落 (上) 與啟用連字功能的段落 (下)。

啟用後,只有在下列情況下才會使用連字號:

  • 字詞太長,無法放在同一行。如果使用 Simple 換行策略,只有在行長度短於單一字詞時,才會在字詞中加入連字號。
  • 裝置上已設定適當的語言代碼,因為系統會使用現有的字典來判斷適當的連字號。