当前位置: 首页 > 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…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...