设置文本样式

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

字词

使用 Brush 启用高级样式

如需启用更高级的文本样式,您可以将 Brush API 与 TextStyleSpanStyle 结合使用。现在,在任何通常使用 TextStyleSpanStyle 的地方,都可以使用 Brush

使用画笔设置文本样式

使用 TextStyle 中的内置画笔配置文本。例如,您可以为文本配置 linearGradient 笔刷,如下所示:

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

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

使用 Brush API 的 `LinearGradient` 函数以及定义的颜色列表。
图 2. 将 Brush API 的 linearGradient 函数与已定义的颜色列表搭配使用。

您可以使用不限于这种特定的配色方案或配色样式。我们提供了一个简单示例来强调一下,您可以使用任何内置的画笔甚至 SolidColor 来增强文本。

集成

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

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

使用 SpanStyle 进行其他样式设置

将画笔应用于部分文本

如果您只想将画笔应用于文本的某些部分,请使用 buildAnnotatedStringSpanStyle API,以及您选择的画笔和渐变效果。

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 用作文本样式。
图 4. 使用默认画笔,并将 linearGradient 用作 Text 的样式。
文本段的不透明度

如需调整特定文本跨度的不透明度,请使用 SpanStyle 的可选 alpha 参数。对文本的两个部分使用同一笔刷,并更改相应 span 中的 Alpha 参数。在代码示例中,第一个文本跨度以半不透明度 (alpha =.5f) 显示,而第二个文本跨度以完全不透明度 (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,为文本跨度添加不透明度。

其他资源

如需查看其他自定义示例,请参阅回顾 Compose 文本着色博文。如果您有兴趣详细了解 Brush 如何与我们的 Animations API 集成,请参阅在 Compose 中为画笔文本着色添加动画效果

对文本应用选取框效果

您可以将 basicMarquee 修饰符应用于任何可组合项,以生成动画滚动效果。如果内容太宽,不适合可用的限制条件,则会出现选取框效应。默认情况下,basicMarquee 已设置特定配置(例如速度和初始延迟),但您可以修改这些参数来自定义效果。

以下代码段会对 Text 可组合项实现基本的选取框效果:

@OptIn(ExperimentalFoundationApi::class)
@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 修饰符。