• Jetpack Compose基础组件之 — Text


    Text的源码参数预览

    1. @Composable
    2. fun Text(
    3. text: String,
    4. modifier: Modifier = Modifier,
    5. color: Color = Color.Unspecified,
    6. fontSize: TextUnit = TextUnit.Unspecified,
    7. fontStyle: FontStyle? = null,
    8. fontWeight: FontWeight? = null,
    9. fontFamily: FontFamily? = null,
    10. letterSpacing: TextUnit = TextUnit.Unspecified,
    11. textDecoration: TextDecoration? = null,
    12. textAlign: TextAlign? = null,
    13. lineHeight: TextUnit = TextUnit.Unspecified,
    14. overflow: TextOverflow = TextOverflow.Clip,
    15. softWrap: Boolean = true,
    16. maxLines: Int = Int.MAX_VALUE,
    17. onTextLayout: (TextLayoutResult) -> Unit = {},
    18. style: TextStyle = LocalTextStyle.current
    19. )

    Text 是 Compose 中最基本的布局组件,它可以显示文字

    1. @Composable
    2. fun TextScreen() {
    3. Text("Hello World")
    4. }

    从 res 中加载文字

    1. @Composable
    2. fun TextScreen() {
    3. Text(stringResource(id = R.string.content))
    4. }
    5. "app_name">examples
    6. "content">桃之夭夭,灼灼其华。之子于归,宜其室家。

    style 参数

    style 参数可以帮助我们配置文本的行高,颜色,粗体等设置。

    Compose 中内置的 MaterialTheme主题 已经为我们准备了一些设计

    1. @Composable
    2. fun TextScreen() {
    3. Column{
    4. Text(text = "Hello World Title",
    5. style = MaterialTheme.typography.headlineLarge)
    6. Text(text ="Hello World Subtitle",
    7. style = MaterialTheme.typography.bodyLarge)
    8. }
    9. }
    10. @Preview(showBackground = true)
    11. @Composable
    12. fun TextScreenPreview() {
    13. TextScreen()
    14. }

    文字间距

    1. @Composable
    2. fun TextScreen() {
    3. Column(
    4. modifier = Modifier.fillMaxWidth(),
    5. horizontalAlignment = Alignment.CenterHorizontally
    6. ) {
    7. Text(
    8. text = "Hello World Title",
    9. style = TextStyle(
    10. fontWeight = FontWeight.W900,
    11. fontSize = 20.sp,
    12. letterSpacing = 17.sp // 文字间距
    13. )
    14. )
    15. }
    16. }

    maxLines 参数

    使用 maxLines 参数可以帮助我们将文本限制在指定的行数之间,如果文本足够短则不会生效,

    如果文本超过 maxLines 所规定的行数,则会进行截断

    1. @Composable
    2. fun TextScreen() {
    3. Column {
    4. Text(
    5. text = "Hello World Title, Hello World Title,Hello World Title,Hello World Title,Hello World Title",
    6. style = MaterialTheme.typography.headlineLarge,
    7. maxLines = 1, // maxLines
    8. )
    9. Text(text = "Hello World Subtitle", style = MaterialTheme.typography.bodyLarge)
    10. }
    11. }

    overflow 处理溢出

    使用 overflow 参数可以帮助我们处理溢出的视觉效果

    1. @Composable
    2. fun TextScreen() {
    3. Column {
    4. Text(
    5. text = "Hello World Title, Hello World Title,Hello World Title,Hello World Title,Hello World Title",
    6. style = MaterialTheme.typography.headlineLarge,
    7. maxLines = 1, // maxLines
    8. overflow = TextOverflow.Ellipsis
    9. )
    10. Text(text = "Hello World Subtitle", style = MaterialTheme.typography.bodyLarge)
    11. }
    12. }

    总共有四种效果, 效果分别依次对应

    textAlign 参数

    当我们在 Text 中设置了 fillMaxWidth() 之后,我们可以指定 Text 的对齐方式

    1. @Composable
    2. fun TextScreen1() {
    3. Column {
    4. Text(
    5. text = "Hello World1",
    6. modifier = Modifier.fillMaxWidth(),
    7. textAlign = TextAlign.Left
    8. )
    9. Text(
    10. text = "Hello World2",
    11. modifier = Modifier.fillMaxWidth(),
    12. textAlign = TextAlign.Center
    13. )
    14. Text(
    15. text = "Hello World3",
    16. modifier = Modifier.fillMaxWidth(),
    17. textAlign = TextAlign.Right
    18. )
    19. }
    20. }

    lineHeight 参数

    使用 lineHeight 参数可以让我们指定 Text 中每行的行高间距

    1. @Composable
    2. fun TextScreen1() {
    3. Column {
    4. Text(text = "Hello World".repeat(15))
    5. Spacer(Modifier.padding(vertical = 15.dp))
    6. Text(
    7. text =
    8. "Hello World".repeat(15), lineHeight = 30.sp
    9. )
    10. }
    11. }

    fontFamily 参数

    使用 fontFamily 参数可以让我们自定义字体,它的调用方法是这样的

    1. @Composable
    2. fun TextScreen1() {
    3. Column {
    4. Text("Hello World", fontFamily = FontFamily.Serif)
    5. Text("Hello World", fontFamily = FontFamily.SansSerif)
    6. }
    7. }

    你也可以加载 res/font 下的字体。

    创建一个 font 文件夹可以右键 res 文件夹,选择 Android Resource Directory -> 选择 font

    1. @Composable
    2. fun TextScreen() {
    3. Text(
    4. text = "Hello World Hello World Hello World Hello World",
    5. fontFamily = FontFamily(Font(R.font.pingfang, FontWeight.W700))
    6. )
    7. }

    可点击的 Text

    有的时候也许您需要将文本当作按钮,那么只需要添加 Modifier.clickable 即可

    1. @Composable
    2. fun TextScreen() {
    3. Text(
    4. text = "Modifier.clickable用于修饰元素可以点击",
    5. modifier = Modifier.clickable(onClick = { })
    6. )
    7. }

    取消点击波纹

    但是我们会发现,clickable 有自带的波纹效果,如果我们想要取消的话,只需要添加两个参数即可

    1. @Composable
    2. fun TextScreen1() {
    3. val context = LocalContext.current
    4. Column {
    5. Text(
    6. text = "Modifier.clickable用于修饰元素可以点击",
    7. modifier = Modifier.clickable(
    8. onClick = {
    9. Toast.makeText(
    10. context,
    11. "你点击了此文本",
    12. Toast.LENGTH_LONG
    13. ).show()
    14. },
    15. indication = null,
    16. interactionSource = MutableInteractionSource()
    17. )
    18. )
    19. }
    20. }

    特定的文字显示

    如果我们想让一个 Text 语句中使用不同的样式,比如粗体提醒,特殊颜色

    则我们需要使用到 buildAnnotatedString

    1. @Composable
    2. fun TextScreen1() {
    3. Column(
    4. modifier = Modifier.fillMaxWidth(),
    5. horizontalAlignment = Alignment.CenterHorizontally
    6. ) {
    7. Text(buildAnnotatedString {
    8. append("Hello World 正常文本")
    9. withStyle (style = SpanStyle(fontWeight = FontWeight.W900)) { append("加粗文本") }
    10. })
    11. }
    12. }

    文字超链接(ClickableText)

    Modifier.Clickable() 无法检测 Text 中的部分点击,那如果我们需要检测一个 Text 中的部分点击事件该怎么办呢?就像我们经常在 App 底下看到的用户协议等

    其实很简单,Compose 也给我们准备了 ClickableText,来看看如何使用吧

    1. @Composable
    2. fun TextScreen1() {
    3. val text = buildAnnotatedString {
    4. append("勾选即代表同意")
    5. withStyle(
    6. style = SpanStyle(
    7. color = Color(0xFF0E9FF2),
    8. fontWeight = FontWeight.Bold
    9. )
    10. ) { append("用户协议") }
    11. }
    12. ClickableText(text = text, onClick = { offset -> Log.d(TAG, "Hi,你按到了第 $offset 位的文字") })
    13. }

    但是...怎么才能检测用户协议这四个字符的点击事件呢?Compose 在 buildAnnotatedString 和 ClickableText 中引入了相应的方法

    • 多了一个 pushStringAnnotation() 方法,它会将给定的注释附加到任何附加的文本上,直到相应的 pop 被调用
    • getStringAnnotations() 方法是查询附加在这个 AnnotatedString 上的字符串注释。注释是附加在 AnnotatedString 上的元数据,例如,在我们的代码中 "tag" 是附加在某个范围上的字符串元数据。注释也与样式一起存储在 Range 中
    1. @Composable
    2. fun TextScreen1() {
    3. val annotatedText = buildAnnotatedString {
    4. append("勾选即代表同意")
    5. pushStringAnnotation(
    6. tag = "tag",
    7. annotation = "用户协议"
    8. )
    9. withStyle(
    10. style = SpanStyle(
    11. color = Color(0xFF0E9FF2),
    12. fontWeight = FontWeight.Bold
    13. )
    14. ) {
    15. append("用户协议")
    16. }
    17. pop()
    18. }
    19. ClickableText(
    20. text = annotatedText,
    21. onClick = { offset ->
    22. annotatedText.getStringAnnotations(
    23. tag = "tag", start = offset,
    24. end = offset
    25. ).firstOrNull()?.let { annotation ->
    26. Log.d(TAG, "你已经点到 ${annotation.item} 啦")
    27. }
    28. }
    29. )
    30. }

    文字复制

    默认情况下 Text 并不能进行复制等操作,我们需要设置 SelectionContainer 来包装 Text

    1. @Composable
    2. fun TextScreen1() {
    3. SelectionContainer {
    4. Column{
    5. Text(
    6. text = "你摸鱼",
    7. modifier = Modifier.fillMaxWidth(),
    8. textAlign = TextAlign.Left
    9. )
    10. Text(
    11. text = "我摸鱼",
    12. modifier = Modifier.fillMaxWidth(),
    13. textAlign = TextAlign.Center
    14. )
    15. Text(
    16. text = "老板宝马变青桔",
    17. modifier = Modifier.fillMaxWidth(),
    18. textAlign = TextAlign.Right
    19. )
    20. }
    21. }
    22. }

    文字强调效果

    文字根据不同情况来确定文字的强调程度,以突出重点并体现出视觉上的层次感。

    Material Design 建议采用不同的不透明度来传达这些不同的重要程度,你可以通过 LocalContentAlpha 实现此功能。

    您可以通过为此 CompositionLocal 提供一个值来为层次结构指定内容 Alpha 值。(CompositionLocal 是一个用于隐式的传递参数的组件)

    1. // 将内部 Text 组件的 alpha 强调程度设置为高
    2. // 注意: MaterialTheme 已经默认将强调程度设置为 high
    3. CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high){
    4. Text("这里是high强调效果")
    5. }
    6. // 将内部 Text 组件的 alpha 强调程度设置为中
    7. CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium){
    8. Text("这里是medium强调效果")
    9. }
    10. // 将内部 Text 组件的 alpha 强调程度设置为禁用
    11. CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.disabled) {
    12. Text("这里是禁用后的效果")
    13. }

    文字水平位置

    一般情况下,Text 不会水平居中,如果你在 RowColumnBox 这些 Composable 里面想要实现居中的效果,你可以在 Text 外围写一个 BoxRowColumn 等, 像这样:

    1. @Composable
    2. fun TextScreen1() {
    3. Column {
    4. Text("123")
    5. Text("456")
    6. Box(
    7. modifier = Modifier.fillMaxWidth(),
    8. contentAlignment = Alignment.Center
    9. ) {
    10. Text("789")
    11. }
    12. }
    13. }

    水平靠左: Alignment.Start

    水平靠右: Alignment.End

    如果你的 Column 有 Modifier.fillMaxWidth() 的属性或者指定了宽度/大小,那么你可以直接在 Text 里面写 Modifier.align(Alignment.CenterHorizontally) 来让 Text 处于水平居中的位置

    Text 的其他用法icon-default.png?t=N7T8https://developer.android.com/jetpack/compose/text

  • 相关阅读:
    谷粒学苑_第六天
    【kafka】可视化工具KAFKA EAGLE安装分享
    stm32 用定时器的编码器模式来检测正反转
    第06章 第06章 查找
    基于C++实现平台类对战游戏
    [附源码]Python计算机毕业设计Django软考刷题小程序
    前端面试题:
    【计算机操作系统慕课版】第一章课后习题
    《Linux驱动:DMA直接内存访问》
    【算法与数据结构】--高级算法和数据结构--哈希表和集合
  • 原文地址:https://blog.csdn.net/huangjianfeng21/article/details/132863510