Jetpack Compose - Text

Compose系列文章,请点原文阅读。原文,是时候学习Compose了!

1、属性一览

首先直接看下官网给的两种方法,链接在这里

@Composable fun Text(
    text: String, 
    modifier: Modifier = Modifier, 
    color: Color = Color.Unspecified, 
    fontSize: TextUnit = TextUnit.Inherit, 
    fontStyle: FontStyle? = null, 
    fontWeight: FontWeight? = null, 
    fontFamily: FontFamily? = null, 
    letterSpacing: TextUnit = TextUnit.Inherit, 
    textDecoration: TextDecoration? = null, 
    textAlign: TextAlign? = null, 
    lineHeight: TextUnit = TextUnit.Inherit, 
    overflow: TextOverflow = TextOverflow.Clip, 
    softWrap: Boolean = true, 
    maxLines: Int = Int.MAX_VALUE, 
    onTextLayout: (TextLayoutResult) -> Unit = {}, 
    style: TextStyle = AmbientTextStyle.current
): Unit


@Composable fun Text(
    text: AnnotatedString, 
    modifier: Modifier = Modifier, 
    color: Color = Color.Unspecified, 
    fontSize: TextUnit = TextUnit.Inherit, 
    fontStyle: FontStyle? = null, 
    fontWeight: FontWeight? = null, 
    fontFamily: FontFamily? = null, 
    letterSpacing: TextUnit = TextUnit.Inherit, 
    textDecoration: TextDecoration? = null, 
    textAlign: TextAlign? = null, 
    lineHeight: TextUnit = TextUnit.Inherit, 
    overflow: TextOverflow = TextOverflow.Clip, 
    softWrap: Boolean = true, 
    maxLines: Int = Int.MAX_VALUE, 
    inlineContent: Map<String, InlineTextContent> = mapOf(), 
    onTextLayout: (TextLayoutResult) -> Unit = {}, 
    style: TextStyle = AmbientTextStyle.current
): Unit

这两种方式的区别就在于text参数,一个是String类型,一个是AnnotatedString类型。

  • text: String
    普通的字符串;
  • text: AnnotatedString
    带有不同属性的字符串,例如可以在一串字符中设置某些字符的颜色、字体、大小等属性;
  • modifier: Modifier = Modifier
    这是一个很重要的属性Modifier(修饰符),关于修饰符的问题我们在布局中再仔细学习,这里学习控件就先简单的使用它的宽高以及margin和padding属性即可。
  • color: Color = Color.Unspecified
    字体的颜色
  • fontSize: TextUnit = TextUnit.Inherit
    绘制文本时使用的字形大小。请参见TextStyle.fontSize。
  • fontStyle: FontStyle? = null
    绘制字母时使用的字体变体(例如,斜体)。请参见TextStyle.fontStyle。
  • fontWeight: FontWeight? = null
    绘制文本时要使用的字体粗细(例如FontWeight.Bold)。
  • fontFamily: FontFamily? = null
    呈现文本时要使用的字体系列。请参见TextStyle.fontFamily。
  • letterSpacing: TextUnit = TextUnit.Inherit
    每个字母之间添加的空间量。请参见TextStyle.letterSpacing。
  • textDecoration: TextDecoration? = null
    要在文字上绘制的装饰(例如下划线)。请参见TextStyle.textDecoration。
  • textAlign: TextAlign? = null
    文本在段落中的对齐方式。请参见TextStyle.textAlign。
  • lineHeight: TextUnit = TextUnit.Inherit
    以TextUnit为单位的段落的行高,例如SP或EM。请参见TextStyle.lineHeight。
  • overflow: TextOverflow = TextOverflow.Clip
    视觉溢出应的处理方式,例如尾部显示…或者中间显示…。
  • softWrap: Boolean = true
    文本是否应在换行符处中断。如果为false,则文本的宽度会在水平方向上无限延伸,且textAlign属性失效,可能会出现异常情况。
  • maxLines: Int = Int.MAX_VALUE
    文本可跨越的可选最大行数,必要时可以换行。如果文本超过给定的行数,则会根据textAlign和softWrap属性截断文本。它的值必须大于零。
  • onTextLayout: (TextLayoutResult) -> Unit = {}
    计算新的文本布局时执行的回调。
  • style: TextStyle = AmbientTextStyle.current
    文本的样式配置,例如颜色,字体,行高等。也就是说上面属性中的color,fontSize等一些属性也可以在这里进行声明。具体包含的属性可以参考TextStyle类。

2、使用示例

接下来请看一段示例代码,该代码使用的是带AnnotatedString属性的Text(),如下所示:


@Composable

@Composable
fun TextDemo(startString: String, endString: String) {
    val annotatedStringBuilder = AnnotatedString.Builder(startString)
    annotatedStringBuilder.pushStyle(
            SpanStyle(
                    color = Color.Red,
                    fontSize = 24.sp,
                    fontStyle = FontStyle.Italic,
            )
    )
    annotatedStringBuilder.append("【可以】")
    annotatedStringBuilder.pop()
    annotatedStringBuilder.append(endString)
    val annotatedString = annotatedStringBuilder.toAnnotatedString()

    Text(
            text = annotatedString,
//            color = Color.Red,
            fontSize = 16.sp,
            fontWeight = FontWeight.Bold,
            fontStyle = FontStyle.Normal,
            overflow = TextOverflow.Ellipsis,
            textAlign = TextAlign.Center,
            style = TextStyle(
                    color = Color.White,
                    background = Color.DarkGray
            ),
            modifier = Modifier
                    .width(200.dp)
                    .height(100.dp)
                    .wrapContentSize(align = Alignment.CenterEnd)
                    .drawOpacity(1f)
                    .clickable(onClick = {
                        Log.e("点击了全文本", "点击事件")
                    })
                    .background(color = Color.Yellow)
    )
}

@Preview
@Composable
fun previewTextDemo() {
    TextDemo(startString = "你", endString = "的")
}

在上述代码中,我们给Text设置了【深灰背景】【16号白色字体】,然后AnnotatedString中我们添加了一个【24号红色斜体】的文本,最后在修饰符属性中我们设置了固定的宽高,以及【居中尾部对齐】方式,并且设置了【黄色背景】。

渲染结果如下图所示:
在这里插入图片描述

仔细看下文本的背景仅会绘制在文本所占长度的区域,Modifier修饰符设置的背景也仅仅绘制在文本的区域,但是比文本区域稍微大了一些,而不是设置的200*100的宽度。虽然渲染图上只有左侧有黄色背景,但运行到手机上其实左右两侧都有一点黄色区域的。

关于Modifier我们到布局的时候再仔细研究,目前仅用一些基础属性来示例好了。

3、版本更新

  • alpha08
    该版本对Text改动不大,无需过多说明;

4、未解决问题

给整个Text设置点击事件的话是可以在Modifier中的clickable()方法设置的,请参考上文代码示例。
但是目前笔者还没有找到单独给上文中的红色字体设置点击事件的API,如果各位有发现请不吝赐教。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值