JetPack Compose系列之Text

185 阅读4分钟

compose-roadmap.svg

前言

如何快速高效的掌握一门学问,建议先阅读下这篇文章关于学习的一些看法

码字不易,记得关注+点赞+收藏

该系列的其他文章:JetPack Compose系列之总览

概述

  • 文字对任何界面都属于核心内容,而利用 Jetpack Compose 可以更轻松地显示或写入文字。
  • Compose 提供了基础的 BasicText和 BasicTextField,它们是用于显示文本和处理用户输入的主要函数。Compose 还提供了更高级的 Text和 TextField,它们是遵循 Material Design 准则的可组合项。
  • 建议在 Android 平台上使用这些构建块,因为它们的外观和样式非常适合 Android 用户,而且还包括可用以简化用户自定义设置的其他选项,无需编写大量代码。

Text的属性

fun Text(
    text: String,//文本内容
    modifier: Modifier = Modifier,//修饰符
    color: Color = Color.Unspecified,//文本颜色
    fontSize: TextUnit = TextUnit.Unspecified,//文本大小
    fontStyle: FontStyle? = null,//文本样式, 如普通、粗体、斜体等
    fontWeight: FontWeight? = null,//文本粗细
    fontFamily: FontFamily? = null,//文本字体
    letterSpacing: TextUnit = TextUnit.Unspecified,//文本之间的间距
    textDecoration: TextDecoration? = null,//文本装饰,如下划线、删除线等
    textAlign: TextAlign? = null,//对齐方式,如 start、center、end 等
    lineHeight: TextUnit = TextUnit.Unspecified,//行高(单位sp)
    overflow: TextOverflow = TextOverflow.Clip,//文本溢出的视觉效果
    softWrap: Boolean = true,//文本是否换行
    maxLines: Int = Int.MAX_VALUE,//文本最大行数
    onTextLayout: (TextLayoutResult) -> Unit = {},//文本在布局中的位置
    style: TextStyle = LocalTextStyle.current//文本样式,如颜色、字体、行高等
)

Text的应用

1、显示文本内容

  • 显示以 String 作为参数文本:
Text("Hello World")
  • 显示资源中的文本:
Text(stringResource(R.string.hello_world))

建议使用字符串资源,而不是对 Text 值进行硬编码,因为使用字符串资源时可以与 Android 视图共享相同的字符串,并为应用国际化做好准备。

2、设置文本样式

  • 设置文本颜色
Text("Hello World", color = Color.Blue)

image.png

  • 设置文本大小
Text("Hello World", fontSize = 30.sp)

image.png

  • 设置文本粗细
Text("Hello World", fontWeight = FontWeight.Bold)

image.png

  • 设置文本为斜体
Text("Hello World", fontStyle = FontStyle.Italic)

image.png

  • 添加阴影

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

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

image.png

  • 添加多种样式

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

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

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

    TextStyle 用于 Text 可组合项, 而 SpanStyle 和 ParagraphStyle 用于 AnnotatedString

    AnnotatedString 有一个类型安全的构建器创建:buildAnnotatedString

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

image.png

3、设置段落样式

  • 设置文本对齐方式

    借助 textAlign 参数,可以在 Text 可组合项 Surface 区域内设置文本的水平对齐方式。

    默认情况下,Text 会根据其内容值选择自然的文字对齐方式:

    • 对于从左到右书写的文字,如拉丁语、西里尔文或朝鲜文,向 Text 容器的左边缘对齐
    • 对于从右到左书写的文字,如阿拉伯语或希伯来语,向 Text 容器的右边缘对齐
Text(
  "Hello World", 
  textAlign = TextAlign.Center,
  modifier = Modifier.width(150.dp)
)

image.png

如果要手动设置 Text 可组合项的文本对齐方式,最好分别使用 TextAlign.Start 和 TextAlign.End(而不是 TextAlign.Left 和 TextAlign.Right),因为它们会根据首选语言文本方向解析为 Text 可组合项的右边缘。例如,TextAlign.End 对于法语文字将向右侧对齐,而对于阿拉伯语文字则将向左侧对齐,但无论对于哪种文字,TextAlign.Right 都将向右侧对齐。

注意:文字对齐与布局对齐不同,后者指的是容器(例如 Row 或 Column)中的可组合项定位。

TextStyle和FontStyle的区别?

TextStyle 和 FontStyle 都可以用于定义 Text 组件的字体样式,但是它们的作用有所不同。

FontStyle 是一个枚举类,定义了四个值:Normal、Italic、Oblique 和 Default。它用于指定字体的风格,比如是否倾斜或斜体。

TextStyle 是一个类,它包含了多个属性,可以用来定义字体的各种样式,包括字体大小、字体颜色、字体家族、字体粗细、字体风格等等。在实际使用中,TextStyle 通常被用于定义更加详细和精细的字体样式,而 FontStyle 则更多地被用于定义字体的基本风格。

3、配置文本布局

  • 限制可见行数
Text("hello ".repeat(50), maxLines = 2)

image.png

  • 文本溢出处理
Text(
 "Hello Compose ".repeat(50), 
 maxLines = 2, 
 overflow = TextOverflow.Ellipsis
)

image.png

记得关注+点赞+收藏, 持续不断更新中