设置文本样式

Text 可组合项有多个用于为其内容设置样式的可选参数。以下列出了适用于最常见文字用例的参数。如需查看 Text 的所有参数,请参阅 Compose Text 源代码

每当您设置其中任何一个参数,都会将样式应用于整个文字值。如果您需要在同一行或 段落中应用多种样式,请参阅有关多种内嵌 样式的部分。

常见文本样式

以下部分介绍了设置文本样式的常见方法。

更改文本颜色

@Composable
fun BlueText() {
    Text("Hello World", color = Color.Blue)
}

字词

更改文本大小

@Composable
fun BigText() {
    Text("Hello World", fontSize = 30.sp)
}

字词

将文本设为斜体

使用 fontStyle 参数可以将文字设为斜体(或设置其他 FontStyle)。

@Composable
fun ItalicText() {
    Text("Hello World", fontStyle = FontStyle.Italic)
}

字词

将文本设为粗体

使用 fontWeight 参数将文字设为粗体文字(或设置其他 FontWeight)。

@Composable
fun BoldText() {
    Text("Hello World", fontWeight = FontWeight.Bold)
}

字词

添加阴影

通过 style 参数,您可以设置一个类型为 TextStyle 的对象并配置多个参数,例如阴影。 Shadow 会接收阴影颜色、偏移量或相对于 Text 所在的位置和模糊半径(用来控制模糊效果)。

@Composable
fun TextShadow() {
    val offset = Offset(5.0f, 10.0f)
    Text(
        text = "Hello world!",
        style = TextStyle(
            fontSize = 24.sp,
            shadow = Shadow(
                color = Color.Blue, offset = offset, blurRadius = 3f
            )
        )
    )
}

字词

在文本中添加多种样式

如需在同一 Text 可组合项中设置不同的样式,请使用 AnnotatedString, 该字符串可使用任意注解样式加以注解。

AnnotatedString 是一个数据类,其中包含:

  • 一个 Text
  • 一个 SpanStyleRangeList,等同于位置范围在文字值内的内嵌样式
  • 一个 ParagraphStyleRangeList,用于指定文字对齐、文字方向、行高和文字缩进样式

TextStyle 用于 Text 可组合项,而 SpanStyleParagraphStyle 用于 AnnotatedString。如需详细了解段落中的多种样式,请参阅在段落中添加多种样式

AnnotatedString 有一个 类型安全 构建器 以便您更轻松地创建以下代码:buildAnnotatedString

@Composable
fun MultipleStylesInText() {
    Text(
        buildAnnotatedString {
            withStyle(style = SpanStyle(color = Color.Blue)) {
                append("H")
            }
            append("ello ")

            withStyle(style = SpanStyle(fontWeight = FontWeight.Bold, color = Color.Red)) {
                append("W")
            }
            append("orld")
        }
    )
}

字词

使用 AnnotatedString.fromHtml() 在 Jetpack Compose 应用中显示包含 可点击链接的 HTML 格式文本。此函数会将包含 HTML 标记的字符串转换为 AnnotatedString,从而实现样式设置和链接处理。

示例:包含带样式的链接的 HTML

此代码段会呈现包含链接的 HTML 格式文本,并为该链接应用特定样式:

代码要点
  • AnnotatedString.fromHtml() 会将 htmlText 字符串转换为 AnnotatedStringlinkStyles 参数用于自定义链接外观。

  • TextLinkStyles 用于定义 HTML 中链接的样式。SpanStyle 用于为链接设置文本装饰、字体样式和颜色。

  • Text 可组合项会显示生成的 AnnotatedString

结果

此代码段会将“Jetpack Compose”设为可点击的链接,并为其设置蓝色、下划线和斜体样式:

一个 H1 标题“Jetpack Compose”,后跟“使用 Jetpack Compose 打造更出色的应用”,其中 Jetpack Compose 是一个可点击的链接,样式为蓝色、下划线和斜体。
图 2.标题和段落,其中段落中的“Jetpack Compose”是可点击的带样式的链接。

使用 Brush 启用高级样式

如需启用更高级的文本样式,您可以将 Brush API 与 TextStyleSpanStyle 搭配使用。在通常使用 TextStyleSpanStyle 的任何位置,您现在也可以使用 Brush

使用 Brush 设置文本样式

使用 TextStyle 中的内置 Brush 配置文本。例如,您可以 按如下方式为文本配置 linearGradient Brush:

val gradientColors = listOf(Cyan, LightBlue, Purple /*...*/)

Text(
    text = text,
    style = TextStyle(
        brush = Brush.linearGradient(
            colors = gradientColors
        )
    )
)

使用 Brush API 的 `linearGradient` 函数和已定义的颜色列表。
图 3.使用 Brush API 的 linearGradient 函数以及定义的颜色列表。

您不限于使用此特定配色方案或着色样式。虽然 我们提供了一个简单的示例来突出显示,但您可以使用任何内置 画笔,甚至只使用SolidColor来增强文本。

集成

由于您可以将 BrushTextStyleSpanStyle 搭配使用, 因此与 TextFieldbuildAnnotatedString 的集成是无缝的。

如需详细了解如何在 TextField 中使用 Brush API,请参阅 使用 Brush API 设置输入样式

使用 SpanStyle 设置其他样式

为文本 span 应用 Brush

如果您只想为部分文本应用 Brush,请使用 buildAnnotatedStringSpanStyle API,以及您选择的 Brush 和渐变。

Text(
    text = buildAnnotatedString {
        append("Do not allow people to dim your shine\n")
        withStyle(
            SpanStyle(
                brush = Brush.linearGradient(
                    colors = rainbowColors
                )
            )
        ) {
            append("because they are blinded.")
        }
        append("\nTell them to put some sunglasses on.")
    }
)

使用以 linearGradient 为样式的默认画笔作为 Text 的样式。
图 4.使用默认 Brush 并将 linearGradient 作为 Text 的样式。
文本 span 中的不透明度

如需调整特定文本 span 的不透明度,请使用 SpanStyle's 可选 alpha 参数。为文本的两个部分使用相同的 Brush,并更改相应 span 中的 alpha 参数。在代码示例中,第一个文本 span 以半透明度 (alpha =.5f) 显示,而第二个文本 span 以完全不透明度 (alpha = 1f) 显示。

val brush = Brush.linearGradient(colors = rainbowColors)

buildAnnotatedString {
    withStyle(
        SpanStyle(
            brush = brush, alpha = .5f
        )
    ) {
        append("Text in ")
    }
    withStyle(
        SpanStyle(
            brush = brush, alpha = 1f
        )
    ) {
        append("Compose ❤️")
    }
}

使用 buildAnnotatedString 和 SpanStyle 的 alpha 参数以及 linearGradient 为一段文字添加不透明度。
图 5.使用 buildAnnotatedStringSpanStyle 的 Alpha 参数,以及 linearGradient 为文本 span 添加不透明度。

为文本应用跑马灯效果

您可以为任何可组合项应用 basicMarquee 修饰符,以产生动画滚动效果。如果内容太宽而无法适应可用约束条件,则会显示跑马灯效果。默认情况下,basicMarquee 设置了某些配置(例如速度和初始延迟),但您可以修改这些参数来自定义效果。

以下代码段在 Text 可组合项上实现了基本的跑马灯效果:

@Composable
fun BasicMarqueeSample() {
    // Marquee only animates when the content doesn't fit in the max width.
    Column(Modifier.width(400.dp)) {
        Text(
            "Learn about why it's great to use Jetpack Compose",
            modifier = Modifier.basicMarquee(),
            fontSize = 50.sp
        )
    }
}

图 6. 应用于文本的 basicMarquee 修饰符。

其他资源