我用Ai学Android Jetpack Compose之Text
这篇开始学习各种UI元素,答案来自 通义千问,通义千问没法生成图片,图片是我补充的。 下述代码只要复制到第一个工程,做一些import操作,一般import androidx.compose包里的东西,即可看到预览效果。完整工程代码,见本文最后。
文章目录
- 1.我先学Text,麻烦你介绍一下
- 1. **基础用法**
- A. **简单文本显示**
- B. **使用资源文件中的字符串**
- 2. **常见属性**
- 3. **修饰符 (Modifiers)**
- 4. **进阶功能**
- A. **带样式的文本 (Styled Text)**
- B. **链接文本 (Clickable Links)**
- C. **文本输入框 (TextField)**
- 5. **最佳实践**
- 总结
- 2.如何自定义 `Text` 组件的样式?
- 1. **内联样式**
- 2. **使用 `TextStyle`**
- 3. **使用 `Typography`**
- 4. **创建可复用的 `Text` 组件**
- 5. **动态样式**
- 6. **使用 `AnnotatedString` 和 `SpanStyle`**
- 7. **最佳实践**
- 总结
1.我先学Text,麻烦你介绍一下
当然可以!Text 是 Jetpack Compose 中最常用的 Composable 函数之一,用于显示文本内容。它提供了丰富的配置选项来定制文本的外观和行为。下面将详细介绍 Text 的基本用法、常见属性以及一些高级特性。
1. 基础用法
A. 简单文本显示
最基本的用法是直接传递一个字符串给 Text 函数:
@Composable
fun SimpleText() {Text(text = "Hello, World!")
}
显示效果为:
B. 使用资源文件中的字符串
为了支持多语言和更好的维护性,通常推荐从资源文件中读取字符串:
@Composable
fun LocalizedText() {Text(text = stringResource(id = R.string.hello_world))
}
2. 常见属性
Text 提供了多种属性来控制文本的样式和布局。以下是一些常用的属性及其说明:
text:要显示的文本内容,可以是普通字符串或通过AnnotatedString来实现更复杂的文本格式。modifier:用于添加修饰符(如点击事件、背景颜色等),详见下文。color:设置文本的颜色,默认为黑色。fontSize:指定字体大小,默认单位为sp(scale-independent pixels)。fontWeight:定义字体粗细,例如FontWeight.Bold或FontWeight.Light。fontFamily:选择自定义字体系列。maxLines:限制最大行数,超过部分会截断并显示省略号。overflow:当文本超出指定区域时如何处理,可选值包括TextOverflow.Clip和TextOverflow.Ellipsis。textAlign:对齐方式,如TextAlign.Center、TextAlign.Start等。style:应用全局文本样式,可以通过Typography类进行定义。
示例代码:
@Composable
fun StyledText() {Text(text = "Hello, World!",color = Color.Blue,fontSize = 24.sp,fontWeight = FontWeight.Bold,fontFamily = FontFamily.SansSerif,maxLines = 1,overflow = TextOverflow.Ellipsis,textAlign = TextAlign.Center,modifier = Modifier.padding(16.dp).background(Color.LightGray).clickable { /* Handle click */ })
}
上述代码显示效果如下:

3. 修饰符 (Modifiers)
修饰符是Jetpack Compose中用来调整UI组件外观和行为的强大工具。对于Text组件来说,常见的修饰符包括但不限于:
Modifier.padding():为文本四周添加内边距。Modifier.background():设置文本背景颜色或绘制形状。Modifier.clickable():使文本可点击,并处理点击事件。Modifier.width()和Modifier.height():固定宽度和高度。Modifier.wrapContentSize():让文本根据内容自动调整尺寸。
4. 进阶功能
A. 带样式的文本 (Styled Text)
通过 AnnotatedString 可以创建带有不同样式的复杂文本:
@Composable
fun StyledParagraph() {val annotatedString = buildAnnotatedString {withStyle(style = SpanStyle(color = Color.Red)) {append("Red ")}withStyle(style = SpanStyle(color = Color.Green)) {append("Green ")}withStyle(style = SpanStyle(color = Color.Blue)) {append("Blue")}}Text(text = annotatedString)
}
上述代码,效果如下:

B. 链接文本 (Clickable Links)
可以使用 ClickableText 来创建可点击的超链接或其他交互式文本元素:
@Composable
fun ClickableLinkText() {val uriHandler = LocalUriHandler.currentClickableText(text = AnnotatedString("Click here to visit the official website."),onClick = { offset ->if (offset >= 6 && offset <= 10) {uriHandler.openUri("https://developer.android.com")}})
}
效果如下:

C. 文本输入框 (TextField)
虽然这不是 Text 组件本身的功能,但了解 TextField 对于构建完整的表单界面非常重要。它可以与 Text 结合使用,提供用户输入的能力。
@Composable
fun TextInputField() {var text by remember { mutableStateOf("") }TextField(value = text,onValueChange = { newText -> text = newText },label = { Text("Enter your name") })
}
上述代码有错,通过 通义千问,可以解决,代码改为:
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TextInputField() {var text by remember { mutableStateOf("") }TextField(value = text,onValueChange = { newText: String -> text = newText },label = { Text("Enter your name") })
}
还有一些import,代码效果如下:

5. 最佳实践
- 保持简洁:尽量减少每个
Text组件的复杂度,避免在一个地方做太多事情。 - 复用样式:如果多个地方需要相同的文本样式,考虑创建一个可复用的样式对象。
- 国际化支持:始终优先使用资源文件中的字符串,以便更容易地进行多语言适配。
- 性能优化:注意不要过度使用复杂的文本格式化,以免影响性能。
总结
Text 是 Jetpack Compose 中不可或缺的一部分,掌握了它的基本用法和高级特性后,你可以轻松地构建出美观且功能丰富的文本UI。随着你对Compose框架理解的加深,你会发现更多有趣的应用场景和技术细节。希望这些信息对你有所帮助!
如果你有任何进一步的问题或需要更详细的解释,请随时提问!祝你在学习Compose的过程中一切顺利。
2.如何自定义 Text 组件的样式?
自定义 Text 组件的样式是 Jetpack Compose 中非常常见的需求,可以通过多种方式来实现。下面将详细介绍如何通过不同的方法来自定义 Text 的外观,包括使用内联样式、全局样式配置以及创建可复用的样式组件。
1. 内联样式
最直接的方法是在每个 Text 组件中直接指定样式属性。这种方式适合快速原型设计或临时调整,但对于大型项目来说不够灵活和易于维护。
@Composable
fun InlineStyledText() {Text(text = "Hello, World!",color = Color.Blue,fontSize = 24.sp,fontWeight = FontWeight.Bold,fontFamily = FontFamily.SansSerif,textAlign = TextAlign.Center,modifier = Modifier.padding(16.dp))
}
2. 使用 TextStyle
TextStyle 是一个数据类,用于封装文本的所有样式信息。你可以创建一个 TextStyle 对象,并将其传递给 Text 组件的 style 参数。这种方法使得样式可以被提取出来并集中管理,从而提高了代码的可读性和可维护性。
val customStyle = TextStyle(color = Color.Blue,fontSize = 24.sp,fontWeight = FontWeight.Bold,fontFamily = FontFamily.SansSerif,textAlign = TextAlign.Center
)@Composable
fun StyledWithTextStyle() {Text(text = "Hello, World!",style = customStyle,modifier = Modifier.padding(16.dp))
}
3. 使用 Typography
Typography 提供了一种更高级的方式来定义和组织多个 TextStyle。它允许你为不同类型的文字(如标题、副标题、正文等)预设样式,并在整个应用程序中统一应用这些样式。
首先,在项目的 Theme.kt 文件中定义 Typography:
private val LightColors = lightColors(primary = Color(0xFF6200EE),// ...其他颜色设置...
)private val Typography = Typography(h1 = TextStyle(fontFamily = FontFamily.SansSerif,fontWeight = FontWeight.W300,fontSize = 96.sp),h2 = TextStyle(fontFamily = FontFamily.SansSerif,fontWeight = FontWeight.Normal,fontSize = 60.sp),body1 = TextStyle(fontFamily = FontFamily.Default,fontWeight = FontWeight.Normal,fontSize = 16.sp),// ...其他样式定义...
)@Composable
fun MyAppTheme(content: @Composable () -> Unit) {MaterialTheme(colors = LightColors,typography = Typography,content = content)
}
然后在你的 Text 组件中引用这些预设样式:
@Composable
fun TypedText() {Text(text = "This is an H1 heading",style = MaterialTheme.typography.h1,modifier = Modifier.padding(16.dp))
}
上述代码不全,没有运行效果。
4. 创建可复用的 Text 组件
为了进一步提高代码的复用性和一致性,可以创建自己的 Text 组件,封装常用的样式和行为。这样可以在多个地方重复使用相同的组件,而不需要每次都重新定义样式。
@Composable
fun CustomText(text: String, modifier: Modifier = Modifier) {Text(text = text,style = MaterialTheme.typography.body1.copy(color = Color.Blue),modifier = modifier.padding(16.dp))
}// 使用自定义组件
@Composable
fun UseCustomText() {CustomText("Hello, World!")
}
上述代码效果如下:

5. 动态样式
有时你可能需要根据某些条件动态地改变文本样式。这可以通过结合状态变量和逻辑判断来实现。
@Composable
fun DynamicStyledText(isBold: Boolean) {val textStyle = if (isBold) {TextStyle(fontWeight = FontWeight.Bold)} else {TextStyle(fontWeight = FontWeight.Normal)}Text(text = "Dynamic Style",style = MaterialTheme.typography.body1.merge(textStyle),modifier = Modifier.padding(16.dp))
}
上述代码效果如下:

6. 使用 AnnotatedString 和 SpanStyle
如果你需要在同一段文本中应用多种样式(例如部分文本加粗、变色),可以使用 AnnotatedString 和 SpanStyle 来构建带有样式的文本。
@Composable
fun MultiStyledText() {val annotatedString = buildAnnotatedString {withStyle(style = SpanStyle(color = Color.Red)) {append("Red ")}withStyle(style = SpanStyle(color = Color.Green)) {append("Green ")}withStyle(style = SpanStyle(color = Color.Blue)) {append("Blue")}}Text(text = annotatedString, modifier = Modifier.padding(16.dp))
}
上述代码效果如下:

7. 最佳实践
- 保持样式一致:尽量在整个应用程序中保持一致的样式,避免不同页面或组件之间的视觉差异。
- 分离关注点:将样式定义与业务逻辑分开,使得代码更加清晰易懂。
- 利用主题:充分利用
MaterialTheme和Typography提供的主题功能,确保应用具有一致且专业的外观。 - 复用组件:创建可复用的文本组件,减少重复代码,提高开发效率。
总结
通过上述方法,你可以轻松地自定义 Text 组件的样式,从简单的内联样式到复杂的多样式组合。选择合适的方法取决于具体的应用场景和个人偏好。随着你对 Jetpack Compose 理解的加深,你会找到最适合自己的样式管理策略。
如果你有任何进一步的问题或需要更详细的解释,请随时提问!希望你能通过这些技巧更好地掌握 Jetpack Compose 的文本样式定制能力。
工程代码:Gitee
https://portrait.gitee.com/lwjobs/androidbook/tree/master/source/JetpackCompose/UI/TextTest
相关文章:
我用Ai学Android Jetpack Compose之Text
这篇开始学习各种UI元素,答案来自 通义千问,通义千问没法生成图片,图片是我补充的。 下述代码只要复制到第一个工程,做一些import操作,一般import androidx.compose包里的东西,即可看到预览效果。完整工程代…...
Robot---奇思妙想轮足机器人
1 背景 传统机器人有足式、轮式、履带式三种移动方式,每种移动方式都有各自的优缺点。轮式机器人依靠车轮在地面上移动,能源利用率高、移动速度快,但是仅以轮子与地面接触,缺乏越障能力和对复杂地形的适应能力,尤其面对…...
springcloud 介绍
Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合,它提供了一套完整的工具集,用于快速构建分布式系统。在Spring Cloud的架构中,服务被拆分为一系列小型、自治的微服务,每个服务运行在其独立的进程中,并通过…...
【STM32】I2C为什么要开漏输出和上拉电阻
为什么需要使用开漏输出 防止短路:假设使用推挽结构,多个设备挂在同一总线上,当存在某一设备将某一信号驱动为高电平,而其他设备驱动为低电平,会导致短路,导致器件损坏或降低寿命。对于开漏结构࿰…...
【从零开始入门unity游戏开发之——C#篇44】C#补充知识——var隐式类型、初始化器、匿名类型
文章目录 一、var隐式类型1、var 的基本用法2、注意3、总结 二、初始化器1、类定义2、对象初始化器3、集合初始化3.1 数组初始化3.2 List<T> 初始化3.3 Dictionary<TKey, TValue> 初始化 三、匿名类型1、示例代码2、匿名类型的限制: 专栏推荐完结 一、v…...
Spring Boot 中 TypeExcludeFilter 的作用及使用示例
在Spring Boot应用程序中,TypeExcludeFilter 是一个用于过滤特定类型的组件,使之不被Spring容器自动扫描和注册为bean的工具。这在你想要排除某些类或类型(如配置类、组件等)而不希望它们参与Spring的自动装配时非常有用。 作用 …...
解锁kafka组件安全性解决方案:打造全方位安全防线
文章目录 前言安全漏洞修复权限管理身份验证数据传输数据存储 前言 Kafka组件的安全性解决方案旨在保护Kafka集群免受未经授权访问、数据泄露、知识产权问题和竞争法问题的侵害。提高开源中间件的安全性和稳定性,包括安全漏洞修复、权限管理、身份验证等方面的内容…...
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
目录😋 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务:编写一个程序求图的最小生成树。 相关知识 为了完成…...
Java(1)入门基础
1. Java简介 1.1 什么是Java Java 是一款由Sun Microsystems公司(现为甲骨文公司Oracle Corporation的一部分)的James Gosling及其团队在1995年发布的高级编程语言。同时,Java 是一种面向对象的语言,这意味着它允许开发者通过创…...
2024.1.5总结
今日不开心:这周本来想花点时间学习的,没想到全都花在刷视频,外出消费去了。 今日思考: 1.找对象这件事确实不能强求,顺其自然吧,单身和不单身,其实,各有各的利弊。在一次坐地铁的过程中,我一…...
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、循环控制 / 跳转语句的使用 1. 循环控制语句(for 循环) 2. 循环控制语句(while 循环) 3. 跳转语句(break 语句) 4. 跳转语句(continue 语句&…...
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法
在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法 1. GrpcChannel 的概念 GrpcChannel 是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接,支持多路复用,即通过单个通道可以发送多…...
Linux中的tty和pts概念和区别
目录 1、什么是tty (1)tty的概念 (2)tty0 (3)tty1~6 2、什么是pts (1)pts的含义 (2)pts的具体解释 3、pts与 tty 设备的比较 4、设备文件的位置 1、什…...
【SOC 芯片设计 DFT 学习专栏 -- RTL 中的信号名和 Netlist 中的信号名差异】
Overview 本文将介绍 soc 设计中 RTL-to-Netlist 映射及 RTL 中的信号名和 Netlist 中的信号名差异, 在 SoC设计中,RTL-to-Netlist映射 是从RTL(Register Transfer Level)代码转换为Netlist的过程。这通常涉及将用硬件描述语言&…...
机器学习经典算法——线性回归
目录 算法介绍 一元线性回归模型 多元线性回归模型 误差项分析 相关系数 算法案例 一元线性回归预测——广告销售额案例 二元线性回归预测——血压收缩案例 多元线性回归预测——糖尿病案例 算法介绍 线性回归是利用数理统计中回归分析,来确定两种或两种…...
MLU上使用MagicMind GFPGANv1.4 onnx加速!
文章目录 前言一、平台环境准备二、环境准备1.GFPGAN代码处理2.MagicMind转换修改env.sh修改run.sh参数解析运行 3.修改后模型运行 前言 MagicMind是面向寒武纪MLU的推理加速引擎。MagicMind能将人工智能框架(TensorFlow、PyTorch、Caffe与ONNX等)训练好…...
VulnHub—potato-suncs
使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato,就想着爆破一下密码 hydr…...
【Flink CDC】Flink CDC的Schema Evolution表结构演变的源码分析和流程图
Flink CDC版本:3.2.1 说明:本文从SchemaOperator接收到,表结构变更事件开始,表结构变更事件应由source端产生,本文不讨论。 可以先看流程图,研究源码。 参考文章: Flink cdc3.0动态变更表结构—…...
【智能算法】改进蚁狮优化算法【matlab】
目录 1 主要内容 2 部分程序 3 程序结果 下载链接 1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型,即原始ALO算法的基础上添加了两种改进策略: - 改进1:将原先的间断性边界收缩因子变为连续性边界…...
swagger导出json
要将 Swagger(或者 OpenAPI)文档导出为 JSON 文件,通常有几种常见的方法,具体取决于你使用的 Swagger 工具(如 Swagger UI、Swagger Editor、Swagger Hub 等)。下面列出了几种常见的导出 JSON 文件的方法。 1. 通过 Swagger UI 导出 JSON 文件 如果你在使用 Swagger UI…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
