安卓开发: Compose 中的 Text 文本控件属性详解

news2025/1/13 16:38:54
@Composable
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,
    lineHeight: TextUnit = TextUnit.Unspecified,
    overflow: TextOverflow = TextOverflow.Clip,
    softWrap: Boolean = true,
    maxLines: Int = Int.MAX_VALUE,
    onTextLayout: (TextLayoutResult) -> Unit = {},
    style: TextStyle = LocalTextStyle.current
)

 

 

 

 

字体大小、颜色、粗细、斜体样式

@Composable
fun TextTestView() {
    val content =
        "Hello Compose!"
    Column(Modifier.fillMaxSize()) {
        Text(
            text = content,
            fontSize = 20.sp, // 字体大小
            color = colorResource(id = R.color.purple_200), // 字体颜色
            fontWeight = FontWeight.Bold, // 字体加粗
            fontStyle = FontStyle.Italic // 字体斜体
        )
    }
}

单行 / 多行,超出显示 ...

在属性介绍中讲解了设置单行不允许换行 softWrap、设置最多显示几行 maxLines、内容超出截取显示 overflow,下面使用代码演示。

设置单行不允许换行,文字超出显示 ... 

@Composable
fun TextTestView() {
    val content =
        "文字对任何界面都属于核心内容,而利用 Jetpack Compose 可以更轻松地显示或写入文字。Compose 可以充分利用其构建块的组合,这意味着您无需覆盖各种属性和方法,也无需扩展大型类,即可拥有特定的可组合项设计以及按您期望的方式运行的逻辑。"
        
    Column(Modifier.fillMaxSize()) {
        Text(text = content, softWrap = false, overflow = TextOverflow.Ellipsis)
    }
}

设置多行,超出显示 ...

@Composable
fun TextTestView() {
    val content =
        "文字对任何界面都属于核心内容,而利用 Jetpack Compose 可以更轻松地显示或写入文字。Compose 可以充分利用其构建块的组合,这意味着您无需覆盖各种属性和方法,也无需扩展大型类,即可拥有特定的可组合项设计以及按您期望的方式运行的逻辑。"
        
    Column(Modifier.fillMaxSize()) {
        Text(text = content, maxLines = 3, overflow = TextOverflow.Ellipsis)
    }
}

字体 / 引用字体文件

Compose 内置了几种字体格式,使用 FontFamily. 设置。

@Composable
fun TextTestView() {
    val content = "Hello Compose!"
    Column(Modifier.fillMaxSize()) {
        Text(
            text = content,
            fontSize = 30.sp,
            fontFamily = FontFamily.Cursive
        )
    }
}

 Compose 只提供了四种字体格式是远远不够的,开发者可以引用其他的字体格式文件。 在 res 文件夹下创建 font 文件夹,将 .ttf 的字体格式文件放入该文件夹下,通过代码设置给 Text

@Composable
fun TextTestView() {
    val content = "Hello Compose!"
    Column(Modifier.fillMaxSize()) {
        Text(
            text = content,
            fontSize = 30.sp,
            fontFamily = FontFamily(Font(R.font.panda_font))
        )
    }
}

字间距 / 行间距

设置间距和行距使用的是 sp,因为可能机型系统不同,设置老年人模式或设置统一的字体大小,使用 sp 会根据设置改变。dp 是不会的,Compose 也是强制使用 sp 。

@Composable
fun TextTestView() {
    val content = "Hello Compose!\nHello Compose!"
    Column(Modifier.fillMaxSize()) {
        Text(
            text = content,
            lineHeight = 30.sp,
            letterSpacing = 20.sp
        )
    }
}

中划线 / 下划线

@Composable
fun TextTestView() {
    val content = "Hello Compose!"
    Column(Modifier.fillMaxSize()) {
        Text(
            text = content,
            textDecoration = TextDecoration.Underline
        )
 
        Text(
            text = content,
            textDecoration = TextDecoration.LineThrough
        )
    }
}

文字对齐方向,下面以水平居中为列子:

@Composable
fun TextTestView() {
    val content = "Hello Compose!\nHello Compose!"
    Column(Modifier.fillMaxSize()) {
        Text(
            text = content,
            modifier = Modifier
                .size(300.dp, 50.dp)
                .background(Color.Gray),
            textAlign = TextAlign.Center
        )
 
    }
}

选择文本内容、复制等操作

Text 默认是不支持选择复制的,需要给它包一层 SelectionContainer{}函数,可以在任意层,比如 Text 父 View 的父 View ... 只要包着 Text 就有效。

@Composable
fun TextTestView() {
    SelectionContainer {
        Text("Hello Compose!")
    }
}

字体缩放比例,倾斜角度

Text 设置水平方向缩放比例,倾斜角度使用 textGeometricTransform 设置,其中有两个参数 scaleX 设置文字内容水平方向缩放比例,skewX 设置文字水平方向剪裁倾斜角度。

@Composable
fun TextTestView() {
    val content = "Hello Compose!"
    Column(Modifier.fillMaxSize()) {
        Text(
            text = content,
            style = TextStyle(textGeometricTransform = TextGeometricTransform(2f, -0.5f))
        )
    }
}

文本内容段落缩进

Text 设置段落缩进使用 textIndent,两个参数 firstLine 和 restLine 分别是设置第一行缩进量和其余行的缩进量。

@Composable
fun TextTestView() {
    val content = "文字对任何界面都属于核心内容,而利用 Jetpack Compose 可以更轻松地显示或写入文字。Compose 可以充分利用其构建块的组合,这意味着您无需覆盖各种属性和方法,也无需扩展大型类,即可拥有特定的可组合项设计以及按您期望的方式运行的逻辑。"\n"
    Column(Modifier.fillMaxSize()) {
        Text(
            text = content,
            style = TextStyle(textIndent = TextIndent(20.sp, 10.sp))
        )
    }
}

文本内容多段不同样式
开发中经常会有这种需求,一串字符串中一部分显示不同颜色或加粗等样式的需求,Compose 提供了 buildAnnotatedString{} 文字构建器、withStyle() 设置该段文本的样式(在属性介绍中讲解了具体参数)、append() 文本链接。

下面以常见的隐私协议样式来展示,看代码更好理解。


在代码中可看出每个文本都在 withStyle 中,分别可以设置不同样式,灵活性高不仅可以设置样式,多段点击也是这样实现,下面 交互详解 中介绍。
 

点击监听

Text 点击监听使用 Modifier 设置

@Composable
fun TextTestView() {
   val content =
       "Hello Compose!"
 
   var clickNum by remember {
       mutableStateOf(0)
   }
 
   Text(
       text = content + clickNum,
       modifier = Modifier.clickable(
           onClick = {
               clickNum += 1
           })
   )
}

代码中使用了 Compose 的 remember 和 mutableStateOf 函数,mutableStateOf 是做数据绑定和变动通知的类似 Jetpack 的 liveData,后面写一篇文章详细介绍。

上面代码创建 int 类型变量 clickNum,填写 Text 中显示 UI,点击 Text clickNum + 1,Text 收到变量更新后自动刷新显示新的值,下面看实现效果。

文本多段点击监听
不同位置点击监听使用 ClickableText,它也是继承于 BasicText,只是比 Text 多了 onClick 参数,返回点击内容位置的下标。
 

@Composable
fun TextTestView() {
 
    var clickIndex by remember {
        mutableStateOf(0)
    }
 
    ClickableText(
        text = buildAnnotatedString {
            append("您好,请同意《掘金隐私协议》才可以登陆。")
        },
 
        ) { contentIndex ->
        clickIndex = contentIndex
    }
 
    Text(
        text = "点击的文字下标:${clickIndex}",
        modifier = Modifier.padding(top = 20.dp)
    )
}

这样就可以根据文字下标来判断点击范围。
下面使用 List 将需要点击的文字下标存下,点击时判断范围。

@Composable
fun TextTestView() {
 
    var clickIndex by remember {
        mutableStateOf("")
    }
 
    val clickIndexList: MutableList<Pair<Int, Int>> = ArrayList()
 
    ClickableText(
        text = buildAnnotatedString {
            append("您好,请同意")
 
            withStyle(
                style = SpanStyle(
                    fontWeight = FontWeight.Bold,
                    textDecoration = TextDecoration.Underline
                )
            ) {
                val firstIndex = this.length + 1 // 下标开始
                append("《掘金隐私协议》")
                val endIndex = this.length // 下标结束
                clickIndexList.add(Pair(firstIndex, endIndex))
            }
            append("才可以登陆。")
        },
 
        ) { contentIndex ->
        clickIndex = when (contentIndex) {
            in clickIndexList[0].first..clickIndexList[0].second -> {
                "点击了隐私协议"
            }
            else -> {
                "点击了其他范围"
            }
        }
    }
 
    Text(
        text = clickIndex,
        modifier = Modifier.padding(top = 20.dp)
    )
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wps宏编辑器案例1-自定义函数使用

某公司考情和请假系统是2套独立的系统&#xff0c;人资在月底做考勤统计的时候需要把考勤系统导出的考勤信息表和OA请假流程导出的请假信息表进行合并&#xff0c;得出人员真实的考勤情况。比如员工“忠达”在考勤系统全显示缺勤&#xff0c;实际上请假系统里有4天请假&#xf…

16、Web原生组件注入(Servlet、Filter、Listener)

文章目录 1、使用Servlet API2、使用RegistrationBean 【尚硅谷】SpringBoot2零基础入门教程-讲师&#xff1a;雷丰阳 笔记 路还在继续&#xff0c;梦还在期许 1、使用Servlet API ServletComponentScan(basePackages “com.atguigu.admin”) :指定原生Servlet组件都放在那里…

全景天窗式科普数据仓库

数据仓库是一个面向主题的、集成的、随时间变化但信息本身相对稳定的数据集合&#xff0c;用于支持管理决策过程。其本质就是完成从面向业务过程数据的组织管理到面向业务分析数据的组织和管理的转变过程&#xff0c;也是商业智能BI中数据仓库的主要作用。 数据仓库 - 派可数据…

Spring Boot 定时任务

Spring Boot 提供了方便的注解来实现定时任务。下面是定时任务注解的详细教程&#xff1a; 一、添加依赖 要使用 Spring Boot 的定时任务注解&#xff0c;首先需要在项目中确认已添加过spring-boot-starter的依赖。 <dependency><groupId>org.springframework.b…

【youcans的深度学习 D01】PyTorch例程:从极简线性模型开始

欢迎关注『youcans的深度学习』系列 【youcans的深度学习 D01】PyTorch 例程&#xff1a;从极简线性模型开始 1. PyTorch 建模的基本步骤2. 线性模型的结构3. 建立 PyTorch 线性模型3.1 准备数据集3.2 定义线性模型类3.3 建立一个线性模型3.4 模型训练3.5 模型推断 4. PyTorch …

java-处理xml格式数据

处理xml格式数据 前言一、java处理xml格式数据1、 生成XML格式数据2、 解析XML格式数据 二、问题三、常用类及方法介绍 前言 dom4j是java中的XML API&#xff0c;性能优异、功能强大、开放源代码。 也是所有解析XML文件方法中最常用的&#xff01; 一、java处理xml格式数据 …

榜单发布 新能源乘用车OBC赛道进入转型升级周期

新能源汽车尤其是纯电动汽车市场的快速普及&#xff0c;也带动一批相关核心零部件厂商做大做强。比如&#xff0c;以车载充电机OBC及集成电源行业为例&#xff0c;威迈斯、富特科技等数家公司正在冲刺IPO。 目前&#xff0c;车载电源领域产品主要分为三种&#xff1a;一是单一…

步入AIGC时代,展望人工智能发展

步入AIGC时代&#xff0c;展望人工智能发展 0. 前言1. 步入 AIGC 时代1.1 人工智能简介1.2 AIGC 简介1.3 AIGC 发展与应用 2. CSIG 企业行——走进合合信息2.1 活动介绍2.2 走进合合信息 3. 文档图像处理中的底层视觉技术3.1 什么是底层视觉3.2 智能图像处理技术3.3 智能图像处…

消息中间件RabbitMQ---概述和概念 【一】

1、概述 1、大多应用中&#xff0c;可通过消息服务中间件来提升系统异步通信、扩展解耦能力 2、消息服务中两个重要概念&#xff1a; 消息代理&#xff08;message broker&#xff09;和目的地&#xff08;destination&#xff09; 当消息发送者发送消息以后&#xff0c;将由…

C语言中数据结构——顺序表

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

java多线程详细讲解 线程的创建、线程的状态、synchronized锁、Volatile关键字、和cas锁(自旋锁 乐观锁 无锁)

java多线程详细讲解 线程的创建、线程的状态、synchronized锁、Volatile关键字、和cas锁&#xff08;自旋锁 乐观锁 无锁&#xff09; 一、线程的概念二、创建线程的三种方式三、线程方法Sleep、Yield、Join四、线程的执行状态五、synchronized关键字1.为什么要上锁?2.锁定的内…

SDL初识(1)

简介 SDL(Simple DirectMedia Layer) 是一个跨平台开发库&#xff0c;旨在通过 OpenGL 和 Direct3D 提供对音频、键盘、鼠标、操纵杆和图形硬件的低级访问。 SDL 支持 Windows、Mac OS X、Linux、iOS 和 Android。可以在源代码中找到对其他平台的支持。SDL 是用 C 语言编写的…

JavaScript【六】JavaScript中的字符串(String)

文章目录 &#x1f31f;前言&#x1f31f;字符串(String)&#x1f31f;单引号和双引号的区别&#x1f31f;属性&#x1f31f; length :字符串的长度 &#x1f31f; 方法&#x1f31f; str.charAt(index);&#x1f31f; str.charCodeAt(index);&#x1f31f; String.fromCharCod…

死磕“增长”:火山引擎的实用主义

作者 | 曾响铃 文 | 响铃说 在刘慈欣的科幻小说《三体》中&#xff0c;地外文明为了封锁地球科技&#xff0c;在天文台向地球科学家展现了「宇宙闪烁」这一奇观&#xff0c;试图颠覆人类的认知&#xff0c;从而影响科技进步&#xff0c;促使地球科技发展陷入停滞。 如今&…

给你们讲个笑话——低代码会取代程序员

今天是正经男&#xff0c;我们严肃讨论一下一直以来争吵不休的取代问题。 低代码开发平台&#xff0c;低代码技术会取代开发人员么&#xff1f; 一、背景 低代码开发平台的普及&#xff0c;让很多公司对快速生成应用抱有很大期望。甚至有人认为&#xff0c;低代码开发平台未来…

MTLAB绘图

这里写目录标题 一、图例1、散点图 二、绘图1、总体图形参数2、坐标、图框、网格图框去上右边框小刻度网格坐标范围和刻度控制旋转 坐标、刻度 3、图例图例位置和方向 Location和Orientation图例加标题 、分多列 4、文本 字、字体、字号5、线型 符号6、颜色栏 colorbar7、颜色8…

【技能分享】CAD转SHP最好的方法

1、利用 ArcToolsbox 工具先将 DWG 文件转为 MDB 通过 CASS 软件生成的 DWG 文件&#xff0c;字段中包含有很多属性内容&#xff0c;所以我们先将 DWG 格式 的文件转换为 MDB 格式&#xff0c;再通过 MDB 转换为 SHP 格式数据进行整理。具体步骤如下&#xff1a; 通过 ArcTool…

2023Mathorcup高校数学建模挑战赛ABCD选题建议

提示&#xff1a;本科同学尽量选择C、D题进行作答&#xff0c;获奖率相对会高。C君认为的难度&#xff1a;AD<C<B&#xff0c;开放度&#xff1a;B<C<A<D 。 A题 量子计算机在信用评分卡组合优化中的应用 这道题目是传统的运筹学题目。需要建立客户信用等级的…

阿里ARouter 路由框架解析

一、简介 众所周知&#xff0c;在日常开发中&#xff0c;随着项目业务越来越复杂&#xff0c;项目中的代码量也越来越多&#xff0c;如果维护、扩展、解耦等成了一个非常头疼问题&#xff0c;随之孕育而生的诸如插件化、组件化、模块化等热门技术。 而其中组件化中一项的难点&…

Spring Cloud 之五:Feign使用Hystrix

系列目录&#xff08;持续更新。。。&#xff09; Spring Cloud之一&#xff1a;注册与发现-Eureka工程的创建 Spring Cloud之二&#xff1a;服务提供者注册到Eureka Server Spring Cloud之三&#xff1a;Eureka Server添加认证 Spring Cloud之四&#xff1a;使用Feign实现…