当前位置: 首页 > news >正文

我用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.BoldFontWeight.Light
  • fontFamily:选择自定义字体系列。
  • maxLines:限制最大行数,超过部分会截断并显示省略号。
  • overflow:当文本超出指定区域时如何处理,可选值包括 TextOverflow.ClipTextOverflow.Ellipsis
  • textAlign:对齐方式,如 TextAlign.CenterTextAlign.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. 使用 AnnotatedStringSpanStyle

如果你需要在同一段文本中应用多种样式(例如部分文本加粗、变色),可以使用 AnnotatedStringSpanStyle 来构建带有样式的文本。

@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. 最佳实践

  • 保持样式一致:尽量在整个应用程序中保持一致的样式,避免不同页面或组件之间的视觉差异。
  • 分离关注点:将样式定义与业务逻辑分开,使得代码更加清晰易懂。
  • 利用主题:充分利用 MaterialThemeTypography 提供的主题功能,确保应用具有一致且专业的外观。
  • 复用组件:创建可复用的文本组件,减少重复代码,提高开发效率。

总结

通过上述方法,你可以轻松地自定义 Text 组件的样式,从简单的内联样式到复杂的多样式组合。选择合适的方法取决于具体的应用场景和个人偏好。随着你对 Jetpack Compose 理解的加深,你会找到最适合自己的样式管理策略。

如果你有任何进一步的问题或需要更详细的解释,请随时提问!希望你能通过这些技巧更好地掌握 Jetpack Compose 的文本样式定制能力。

工程代码:Gitee
https://portrait.gitee.com/lwjobs/androidbook/tree/master/source/JetpackCompose/UI/TextTest

相关文章:

我用Ai学Android Jetpack Compose之Text

这篇开始学习各种UI元素&#xff0c;答案来自 通义千问&#xff0c;通义千问没法生成图片&#xff0c;图片是我补充的。 下述代码只要复制到第一个工程&#xff0c;做一些import操作&#xff0c;一般import androidx.compose包里的东西&#xff0c;即可看到预览效果。完整工程代…...

Robot---奇思妙想轮足机器人

1 背景 传统机器人有足式、轮式、履带式三种移动方式&#xff0c;每种移动方式都有各自的优缺点。轮式机器人依靠车轮在地面上移动&#xff0c;能源利用率高、移动速度快&#xff0c;但是仅以轮子与地面接触&#xff0c;缺乏越障能力和对复杂地形的适应能力&#xff0c;尤其面对…...

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速构建分布式系统。在Spring Cloud的架构中&#xff0c;服务被拆分为一系列小型、自治的微服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过…...

【STM32】I2C为什么要开漏输出和上拉电阻

为什么需要使用开漏输出 防止短路&#xff1a;假设使用推挽结构&#xff0c;多个设备挂在同一总线上&#xff0c;当存在某一设备将某一信号驱动为高电平&#xff0c;而其他设备驱动为低电平&#xff0c;会导致短路&#xff0c;导致器件损坏或降低寿命。对于开漏结构&#xff0…...

【从零开始入门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、匿名类型的限制&#xff1a; 专栏推荐完结 一、v…...

Spring Boot 中 TypeExcludeFilter 的作用及使用示例

在Spring Boot应用程序中&#xff0c;TypeExcludeFilter 是一个用于过滤特定类型的组件&#xff0c;使之不被Spring容器自动扫描和注册为bean的工具。这在你想要排除某些类或类型&#xff08;如配置类、组件等&#xff09;而不希望它们参与Spring的自动装配时非常有用。 作用 …...

解锁kafka组件安全性解决方案:打造全方位安全防线

文章目录 前言安全漏洞修复权限管理身份验证数据传输数据存储 前言 Kafka组件的安全性解决方案旨在保护Kafka集群免受未经授权访问、数据泄露、知识产权问题和竞争法问题的侵害。提高开源中间件的安全性和稳定性&#xff0c;包括安全漏洞修复、权限管理、身份验证等方面的内容…...

【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序求图的最小生成树。 相关知识 为了完成…...

Java(1)入门基础

1. Java简介 1.1 什么是Java Java 是一款由Sun Microsystems公司&#xff08;现为甲骨文公司Oracle Corporation的一部分&#xff09;的James Gosling及其团队在1995年发布的高级编程语言。同时&#xff0c;Java 是一种面向对象的语言&#xff0c;这意味着它允许开发者通过创…...

2024.1.5总结

今日不开心:这周本来想花点时间学习的&#xff0c;没想到全都花在刷视频&#xff0c;外出消费去了。 今日思考: 1.找对象这件事确实不能强求&#xff0c;顺其自然吧&#xff0c;单身和不单身&#xff0c;其实&#xff0c;各有各的利弊。在一次坐地铁的过程中&#xff0c;我一…...

【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、循环控制 / 跳转语句的使用 1. 循环控制语句&#xff08;for 循环&#xff09; 2. 循环控制语句&#xff08;while 循环&#xff09; 3. 跳转语句&#xff08;break 语句&#xff09; 4. 跳转语句&#xff08;continue 语句&…...

在调用 borrowObject 方法时,Apache Commons Pool 会根据连接池的配置触发一系列相关的方法

在调用 borrowObject 方法时&#xff0c;Apache Commons Pool 会根据连接池的配置触发一系列相关的方法 1. GrpcChannel 的概念 GrpcChannel 是 gRPC 客户端与服务器之间通信的核心组件。它是基于 HTTP/2 的连接&#xff0c;支持多路复用&#xff0c;即通过单个通道可以发送多…...

Linux中的tty和pts概念和区别

目录 1、什么是tty &#xff08;1&#xff09;tty的概念 &#xff08;2&#xff09;tty0 &#xff08;3&#xff09;tty1~6 2、什么是pts &#xff08;1&#xff09;pts的含义 &#xff08;2&#xff09;pts的具体解释 3、pts与 tty 设备的比较 4、设备文件的位置 1、什…...

【SOC 芯片设计 DFT 学习专栏 -- RTL 中的信号名和 Netlist 中的信号名差异】

Overview 本文将介绍 soc 设计中 RTL-to-Netlist 映射及 RTL 中的信号名和 Netlist 中的信号名差异&#xff0c; 在 SoC设计中&#xff0c;RTL-to-Netlist映射 是从RTL&#xff08;Register Transfer Level&#xff09;代码转换为Netlist的过程。这通常涉及将用硬件描述语言&…...

机器学习经典算法——线性回归

目录 算法介绍 一元线性回归模型 多元线性回归模型 ​误差项分析 相关系数 算法案例 一元线性回归预测——广告销售额案例 二元线性回归预测——血压收缩案例 多元线性回归预测——糖尿病案例 算法介绍 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种…...

MLU上使用MagicMind GFPGANv1.4 onnx加速!

文章目录 前言一、平台环境准备二、环境准备1.GFPGAN代码处理2.MagicMind转换修改env.sh修改run.sh参数解析运行 3.修改后模型运行 前言 MagicMind是面向寒武纪MLU的推理加速引擎。MagicMind能将人工智能框架&#xff08;TensorFlow、PyTorch、Caffe与ONNX等&#xff09;训练好…...

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…...

【Flink CDC】Flink CDC的Schema Evolution表结构演变的源码分析和流程图

Flink CDC版本&#xff1a;3.2.1 说明&#xff1a;本文从SchemaOperator接收到&#xff0c;表结构变更事件开始&#xff0c;表结构变更事件应由source端产生&#xff0c;本文不讨论。 可以先看流程图&#xff0c;研究源码。 参考文章&#xff1a; Flink cdc3.0动态变更表结构—…...

【智能算法】改进蚁狮优化算法【matlab】

目录 1 主要内容 2 部分程序 3 程序结果 下载链接 1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型&#xff0c;即原始ALO算法的基础上添加了两种改进策略&#xff1a; - 改进1&#xff1a;将原先的间断性边界收缩因子变为连续性边界…...

swagger导出json

要将 Swagger(或者 OpenAPI)文档导出为 JSON 文件,通常有几种常见的方法,具体取决于你使用的 Swagger 工具(如 Swagger UI、Swagger Editor、Swagger Hub 等)。下面列出了几种常见的导出 JSON 文件的方法。 1. 通过 Swagger UI 导出 JSON 文件 如果你在使用 Swagger UI…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...