樣式段落

本頁面說明如何為段落設定文字樣式。如要設定段落層級樣式,您可以設定 textAlignlineHeight 等參數,或自行定義 ParagraphStyle

設定文字對齊方式

textAlign 參數可讓您在 Text 組件途徑區中設定文字的水平對齊方式

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

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

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

主題

如要手動設定 Text 可組合項的文字對齊方式,建議您 使用 TextAlign.StartTextAlign.End,而不是 TextAlign.LeftTextAlign.Right 會解析為 Text 的右側邊緣 可組合函式會根據偏好語言文字方向進行處理。例如: TextAlign.End 對齊法文右側和左側 視為阿拉伯文文字,但無論如何,TextAlign.Right 都會對齊右側 使用字母。

在段落中新增多種樣式

如要在段落中新增多個樣式,可以使用 ParagraphStyle AnnotatedString,您可以使用任意註解的樣式加上註解。 將部分文字標示為 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 起即可使用。您可以使用lineHeightText lineHeight 參數,可在 文字。接著,您可以使用新的 LineHeightStyle API 進一步設定 以及文字與聊天室的對齊方式,以及移除空白字元。

建議使用文字單位「em」(相對字型) 調整 lineHeight 而非「sp」(縮放像素) 以提升精確度。如要進一步瞭解 選取適當的文字單元,請參閱 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.AlignmentLineHeightStyle.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 在檢視畫面中的運作方式 這些變更,以及 Compose 的變更和新的 LineHeightStyle 相互整合

插入換行符號

LineBreak API 定義了分割文字的條件 多行。您可以在 Text 可組合項的 TextStyle 區塊。預設的斷行類型包括:

  • Simple - 快速、基本換行。建議用於文字輸入欄位。
  • Heading - 換行與較破壞的規則。建議用於短文字,例如標題。
  • Paragraph:速度較慢、品質較高的換行,提升可讀性。 適合用來處理大量文字,例如段落。

下列程式碼片段同時使用 SimpleParagraph,指定長文字區塊的斷行行為:

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
                )
            )
        }
    )
)

文字區塊:顯示簡單的換行策略,與文字區塊:顯示以段落為優先的換行策略。採用簡單斷行策略的文字區塊,其行長度會更為多變。
圖 1. 採用簡單斷行策略的文字區塊 (上方),與採用段落最佳化斷行策略的文字區塊 (下方)。

在上述輸出內容中,請注意 Paragraph 行破壞行為會產生 比起 Simple 行破壞,視覺效果更平衡。

自訂換行符號

您也可以使用 Strategy 建構自己的 LineBreak 設定。 參數。Strategy 可以是下列任一值:

  • Balanced:嘗試平衡文字的行長度,並在啟用自動斷字時套用斷字。建議用於手錶等小螢幕,以便盡可能顯示更多文字。
  • HighQuality:將段落最佳化,使其更清晰易讀,包括 如果啟用,則為連字號(如果廣告活動不提供任何關鍵字,請使用預設值 BalancedSimple)。
  • 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
            )
        }
    )
)

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

CJK 注意事項

您也可以使用 StrictnessLineBreak WordBreak API,專為 CJK 語言設計。 您可能不會在非中日韓語言中看到這些 API 的效果。整體而言,斷行規則是根據語言代碼定義。

Strictness 會使用下列屬性說明斷行嚴格程度:

  • Default:語言代碼的預設斷字規則。可能對應至 NormalStrict
  • 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
    )
)

日文文字,「嚴格度」和「WordBreak」設定與預設文字的比較。
圖 3. 使用 StrictnessWordBreak 設定格式設定的文字 (上方),與僅使用 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
                )
            )
        }
    )
)

未啟用半形的段落和已啟用半形的段落。啟用連字號時,以連字號分隔字詞並分成兩行。
圖 4. 未啟用斷字功能的段落 (上圖) 與已啟用斷字功能的段落 (下圖)。

啟用後,系統只會在下列情況下進行斷字:

  • 文字超出線條本身。如果使用 Simple 換行策略, 或者,只有在一行字元少於單行時,才會出現連字號 字詞。
  • 裝置上設定正確的語言代碼, 依據系統上的字典所做出的判斷