设置文本样式

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 中的内置 Brush 配置文本。例如,您可以为文本配置 linearGradient Brush,如下所示:

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

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

将 Brush API 的 `linearGradient` 函数与定义的颜色列表搭配使用。
图 2. 将 Brush API 的 linearGradient 函数与定义的颜色列表结合使用。

您不限于这种特定的配色方案或配色风格。虽然我们提供了一个要突出显示的简单示例,但您可以使用任意内置 Brush,甚至只使用 SolidColor 来美化文本。

集成

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

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

使用 SpanStyle 的其他样式设置

对一段文本应用画笔

如果您只想将 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 作为文本样式的默认 Brush。
图 4. 使用默认 Brush,并将 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 来为文本 span 添加不透明度。
图 5. 使用 buildAnnotatedStringSpanStyle 的 alpha 参数,以及 linearGradient 为文本跨度添加不透明度。

其他资源

如需查看其他自定义示例,请参阅 Rrushing on Compose Text Coloring 博文。如果您有兴趣详细了解 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 修饰符。