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

Jetpack Compose 学习笔记(一)—— 快速上手

本篇主要是对 Jetpack Compose 有一个宏观上的了解。

1、Jetpack Compose 是什么与优势

Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API,可以帮助您简化并加快 Android 界面开发。

Compose 的优势(为何采用 Compose):

  • 更少的代码:使用更少的代码实现更多的功能,并且可以避免各种 bug,从而使代码简洁且易于维护
  • 直观:只需描述界面,Compose 会负责处理剩余的工作。应用状态变化时,界面会自动更新
  • 加快应用开发:兼容性现有的所有代码,方便随时采用。借助实时预览和全面的 Android Studio 支持,实现快速迭代
  • 功能强大:凭借对 Android 平台 API 的直接访问和对于 Material Design、深色主题、动画等的内置支持,创建精美的应用

2、Jetpack Compose 入门教程

主要内容来自于 Google 官方的 《Jetpack Compose 教程》。

2.1 Composable 函数与预览

Jetpack Compose 围绕可组合函数构建。这些函数可让您以程序化方式定义应用的界面,只需描述应用界面的外观并提供数据依赖项,而不必关注界面的构建过程(初始化元素、将其附加到父项等)。如需创建可组合函数,只需将 @Composable 注解添加到函数名称中即可。

比如定义一个展示文本的可组合函数:

// 注意,可组合函数首字母要大写
@Composable
fun MessageCard(name: String) {Text(text = "Hello, $name")
}

假如想要预览 UI 效果,可以在可组合函数上添加 @Preview 注解,但是不能直接在原来的可组合函数上加,而是在一个新的函数中调用这个可组合函数:

@Preview
@Composable
fun PreviewMessageCard() {MessageCard(name = "Android")
}

这样在代码编辑区的右上角切换到 Split 或 Design Tab 上,可以看到实时的 UI 预览。

2.2 布局

在 Compose 中,您可以通过从可组合函数中调用其他可组合函数来构建界面层次结构。

如果想为 MessageCard 内添加多个 Text,需要借助 Column 将两个 Text 垂直纵向排列:

fun MessageCard(message: Message) {Column {Text(text = message.author)Text(text = message.body)}
}data class Message(val author: String, val body: String)

如不使用 Column,两个 Text 将会重叠在一起。

水平方向布局使用 Row,再次更新 MessageCard 为其在两个文字的左侧添加一张图片:

@Composable
fun MessageCard(message: Message) {Row {Image(painter = painterResource(id = R.drawable.ic_launcher_foreground),contentDescription = "Contact profile picture")Column {Text(text = message.author)Text(text = message.body)}}
}

为了装饰或配置可组合项,Compose 使用了修饰符。通过修饰符,您可以更改可组合项的大小、布局、外观,还可以添加高级互动,例如使元素可点击。您可以将这些修饰符链接起来,以创建更丰富的可组合项。

fun MessageCard(message: Message) {// 设置四个方向的内边距为 8dpRow(modifier = Modifier.padding(all = 8.dp)) {Image(painter = painterResource(id = R.drawable.ic_launcher_foreground),contentDescription = "Contact profile picture",// 设置图片大小为 40dp 并进行圆形剪裁modifier = Modifier.size(40.dp).clip(CircleShape))// 图片与右侧 Column 的水平间距 8dpSpacer(modifier = Modifier.width(8.dp))Column {Text(text = message.author)// 两个 Text 之间的纵向距离 4dpSpacer(modifier = Modifier.height(4.dp))Text(text = message.body)}}
}

效果图:

2024-9-18.布局修饰符效果

2.3 Material Design

Compose 旨在支持 Material Design 原则。它的许多界面元素都原生支持 Material Design。Material Design 是围绕 Color(颜色)Typography(排版)Shape(形状) 这三大要素构建的。下面逐一添加这些要素。

MaterialTheme 提供已经封装好的主题样式:

  • MaterialTheme.colorScheme 封装了颜色值,比如设置图片边框颜色时,使用 MaterialTheme.colorScheme.primary
  • MaterialTheme.typography 提供了排版样式,为组件的 style 属性提供排版值,如 MaterialTheme.typography.titleSmall
  • MaterialTheme.shapes 提供形状,用于 Surface 可组合项

下面来看如何使用上述属性,还是在 MessageCard 上继续添加:

@Composable
fun MessageCard(message: Message) {Row(modifier = Modifier.padding(all = 8.dp)) {Image(painter = painterResource(id = R.drawable.ic_launcher_foreground),contentDescription = "Contact profile picture",modifier = Modifier.size(40.dp).clip(CircleShape)// 为图片添加边框,颜色使用 MaterialTheme.colorScheme.primary.border(1.5.dp, MaterialTheme.colorScheme.primary, CircleShape))Spacer(modifier = Modifier.width(8.dp))Column {Text(text = message.author,// 颜色color = MaterialTheme.colorScheme.secondary,// 排版style = MaterialTheme.typography.titleSmall)Spacer(modifier = Modifier.height(4.dp))// Surface 指定形状,包含 TextSurface(shape = MaterialTheme.shapes.medium, shadowElevation = 1.dp) {Text(text = message.body,modifier = Modifier.padding(all = 4.dp),// 排版style = MaterialTheme.typography.bodyMedium)}}}
}

经过上述属性的添加,再次预览 UI 效果:

2024-9-18.添加MD后的效果

2.4 深色主题

您可以启用深色主题(或夜间模式),以避免显示屏过亮(尤其是在夜间),或者只是节省设备电量。由于支持 Material Design,Jetpack Compose 默认能够处理深色主题。使用 Material Design 颜色、文本和背景时,系统会自动适应深色背景。

首先,使用在项目中创建的 Material 主题 JetpackComposeTheme(默认创建的主题名字就是项目名 + Theme) 和 Surface 来封装 MessageCard 函数。 在 @PreviewsetContent 函数中都需要执行此操作。这样一来,可组合项即可沿用应用主题中定义的样式,从而在整个应用中确保一致性:

	override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {JetpackComposeTheme {Surface {MessageCard(message = Message("Android", "Jetpack Compose"))}}}}

当系统切换为深色模式时,整个 MessageCard 的布局都会切换为深色:

2024-9-18.深色主题1

但假如你不用 Surface 封装 MessageCard 函数,就只有原本就被 Surface 封装的 “Jetpack Compose” 这个 Text 会切换,其余不会:

2024-9-18.深色主题2

所以前面才说要被 Surface 封装。

除了在真机上运行查看效果,还可以通过为可组合函数添加多个 @Preview 注解进行预览:

@Preview(name = "Light Mode")
@Preview(name = "Dark Mode", uiMode = Configuration.UI_MODE_NIGHT_YES, showBackground = true)
@Composable
fun PreviewMessageCard() {JetpackComposeTheme {Surface {MessageCard(message = Message("Android", "Jetpack Compose"))}}
}

预览界面会为每一个 @Preview 注解生成一个预览图:

2024-9-18.深色主题3

浅色和深色主题的颜色选项是在由 IDE 生成的 Theme.kt 文件中定义的:

private val DarkColorScheme = darkColorScheme(primary = Purple80,secondary = PurpleGrey80,tertiary = Pink80
)private val LightColorScheme = lightColorScheme(primary = Purple40,secondary = PurpleGrey40,tertiary = Pink40/* Other default colors to overridebackground = Color(0xFFFFFBFE),surface = Color(0xFFFFFBFE),onPrimary = Color.White,onSecondary = Color.White,onTertiary = Color.White,onBackground = Color(0xFF1C1B1F),onSurface = Color(0xFF1C1B1F),*/
)

2.5 列表与动画

Compose 可以轻松创建列表并添加有趣的动画效果:

  • 创建消息列表
  • 在展开消息时显示动画效果

消息列表的内容在 Google 教程页面提供了下载链接,内容如下:

/*** SampleData for Jetpack Compose Tutorial */
object SampleData {// Sample conversation dataval conversationSample = listOf(Message("Lexi","Test...Test...Test..."),Message("Lexi","""List of Android versions:|Android KitKat (API 19)|Android Lollipop (API 21)|Android Marshmallow (API 23)|Android Nougat (API 24)|Android Oreo (API 26)|Android Pie (API 28)|Android 10 (API 29)|Android 11 (API 30)|Android 12 (API 31)""".trim()),Message("Lexi","""I think Kotlin is my favorite programming language.|It's so much fun!""".trim()),Message("Lexi","Searching for alternatives to XML layouts..."),Message("Lexi","""Hey, take a look at Jetpack Compose, it's great!|It's the Android's modern toolkit for building native UI.|It simplifies and accelerates UI development on Android.|Less code, powerful tools, and intuitive Kotlin APIs :)""".trim()),Message("Lexi","It's available from API 21+ :)"),Message("Lexi","Writing Kotlin for UI seems so natural, Compose where have you been all my life?"),Message("Lexi","Android Studio next version's name is Arctic Fox"),Message("Lexi","Android Studio Arctic Fox tooling for Compose is top notch ^_^"),Message("Lexi","I didn't know you can now run the emulator directly from Android Studio"),Message("Lexi","Compose Previews are great to check quickly how a composable layout looks like"),Message("Lexi","Previews are also interactive after enabling the experimental setting"),Message("Lexi","Have you tried writing build.gradle with KTS?"),)
}

接下来新建一个可组合函数 Conversation,使用 LazyColumn 展示 Message 列表:

@Composable
fun Conversation(messages: List<Message>) {LazyColumn {items(messages) { message ->MessageCard(message)}}
}

LazyColumn 与 LazyRow 这些可组合项只会呈现屏幕上显示的元素,因此,对于较长的列表,使用它们会非常高效。

这样 MessageCard 列表就显示在屏幕上了,接下来,我们想实现点击 MessageCard 将消息展开/收起的效果:

@Composable
fun MessageCard(message: Message) {Row(modifier = Modifier.padding(all = 8.dp)) {Image(painter = painterResource(id = R.drawable.profile_picture),contentDescription = "Contact profile picture",modifier = Modifier.size(40.dp).clip(CircleShape).border(1.5.dp, MaterialTheme.colorScheme.primary, CircleShape))Spacer(modifier = Modifier.width(8.dp))// 持续追踪是否展开var isExpanded by remember { mutableStateOf(false) }// 每次点击就修改 isExpandedColumn(modifier = Modifier.clickable { isExpanded = !isExpanded }) {Text(text = message.author,color = MaterialTheme.colorScheme.secondary,style = MaterialTheme.typography.titleSmall)Spacer(modifier = Modifier.height(4.dp))Surface(shape = MaterialTheme.shapes.medium, shadowElevation = 1.dp) {Text(text = message.body,modifier = Modifier.padding(all = 4.dp),style = MaterialTheme.typography.bodyMedium,// 如果展开,展示全部内容maxLines = if (isExpanded) Int.MAX_VALUE else 1)}}}
}

效果图如下:

2024-09-18.显式与隐藏Message内容

上面涉及到的主要知识点就是 Compose 的状态 API remember 和 mutableStateOf。简单说,remember 就是开辟空间来保存变量的,只有 isExpanded 通过 remember 将变量值保存起来,这样在遇到重绘或者页面重建的情况下,重新调用 MessageCard 时,isExpanded 的值才不会丢失。配合 mutableStateOf 来改变 UI 状态,可以实现 UI 跟随状态变化而自动更新。

有关状态 API 的详细内容会在后续详解。

使用 remember 时需要注意,需要添加以下导入内容才能正确使用 Kotlin 的 委托属性语法(by 关键字)。按 Alt+Enter 键或 Option+Enter 键即可添加这些内容 :

  • import androidx.compose.runtime.getValue
  • import androidx.compose.runtime.setValue

最后为展开添加动画效果:

@Composable
fun MessageCard(message: Message) {Row(modifier = Modifier.padding(all = 8.dp)) {Image(painter = painterResource(id = R.drawable.profile_picture),contentDescription = "Contact profile picture",modifier = Modifier.size(40.dp).clip(CircleShape).border(1.5.dp, MaterialTheme.colorScheme.primary, CircleShape))Spacer(modifier = Modifier.width(8.dp))var isExpanded by remember { mutableStateOf(false) }// 指定 Surface 的颜色val surfaceColor by animateColorAsState(if (isExpanded) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surface)Column(modifier = Modifier.clickable { isExpanded = !isExpanded }) {Text(text = message.author,color = MaterialTheme.colorScheme.secondary,style = MaterialTheme.typography.titleSmall)Spacer(modifier = Modifier.height(4.dp))Surface(shape = MaterialTheme.shapes.medium,shadowElevation = 1.dp,// Surface 的颜色会渐变color = surfaceColor,// animateContentSize 会逐渐变化 Surface 大小(圆角)modifier = Modifier.animateContentSize().padding(1.dp)) {Text(text = message.body,modifier = Modifier.padding(all = 4.dp),style = MaterialTheme.typography.bodyMedium,maxLines = if (isExpanded) Int.MAX_VALUE else 1)}}}
}

效果图:

2024-09-18.显式与隐藏Message内容动画

3、深入详解 Compose 优化 UI 构建

3.1 Compose 所解决的问题

首先,在编写可维护的软件时,我们的目标是最大程度的减少耦合并增加内聚。因为高耦合意味着一处改,处处改,而高内聚意味着改一处足矣。

其次,尽可能的将相关的代码组织到一起,以便可以轻松的维护,并且方便随着应用规模的增长而扩展代码,这个称为关注点分离

2024-9-18.耦合与内聚

以 ViewModel 与布局文件为例,二者之间是存在许多耦合的:

2024-9-18.ViewModel与layout之间的耦合

即便让业务代码与布局使用不同语言强制它们分离,但是它们之间的联系仍然紧密:

2024-9-18.两种语言or一种语言

既然使用两种语言也会耦合,那么使用同一种语言会有怎样的好处:

2024-9-18.使用同一种语言

比如,想要在页面展示一个列表,那么需要在布局文件中增加一个 RecyclerView,然后在 Java/Kotlin 代码中增加一个适配器,适配器内又要写考虑条目的布局,又要去搞 XML……这样使得逻辑在业务代码和布局代码中来回穿插。但如果使用相同语言的 Kotlin 进行布局,就像下面这样简单:

@Composable
fun Conversation(messages: List<Message>) {LazyColumn {items(messages) { message ->MessageCard(message)}}
}

那么外界使用时无需关心布局具体的细节,只需传入参数 messages 即可实现想要的功能。当然,框架会降低耦合,而不会变成零耦合,因为 UI 上肯定多多少少都会带一点逻辑的。

2024-9-18.Composable函数实现关注点分离

Composable 函数剖析:

2024-9-18.Composable函数剖析

3.2 声明式 UI

2024-9-18.声明式UI1

使用命令式:

2024-9-18.使用命令式

使用声明式:

2024-9-18.使用声明式

声明式的含义:

2024-9-18.声明式的含义

3.3 组合 vs 继承

2024-9-18.组合vs继承

继承存在限制:

2024-9-18.继承的限制

组合的做法:

2024-9-18.组合1

2024-9-18.组合2

2024-9-18.组合3

2024-9-18.组合4

再来看装饰类型的抽象:

2024-9-18.装饰类型的抽象

使用 Compose 解决:

2024-9-18.装饰类型的抽象1

在 Java 的设计中,组合由于继承。因此 Compose 使用组合更有利于自定义控件。

3.4 重组

在后续讲状态等多个地方都会介绍到重组,它可以理解为界面的重绘。由于 Composable 函数是可以重启的,因此可以利用这一点实现界面的局部刷新:

2024-9-18.重组1

使用 Compose,就无需回调函数以及数据订阅等等即可更新在数据发生变化时更新 UI:

2024-9-18.重组2

总结:

2024-9-18.总结

相关文章:

Jetpack Compose 学习笔记(一)—— 快速上手

本篇主要是对 Jetpack Compose 有一个宏观上的了解。 1、Jetpack Compose 是什么与优势 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API&#xff0c;可以帮助您简化并加快 Android 界面开发。 Compose 的优势&am…...

Kafka3.x KRaft 模式 (没有zookeeper) 常用命令

版本号&#xff1a;kafka_2.12-3.7.0 说明&#xff1a;如有多个地址&#xff0c;用逗号分隔 创建主题 bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic demo --partitions 1 --replication-factor 1删除主题 bin/kafka-topics.sh --delete --boots…...

Leetcode 最大正方形

java 实现 class Solution {public int maximalSquare(char[][] matrix) {//处理特殊情况if(matrix null || matrix.length 0 || matrix[0].length 0) return 0;int rows matrix.length;int cols matrix[0].length;int[][] dp new int[rows][cols]; //dp[i][j]的含义是以…...

ubuntu22.04录屏黑屏,飞书共享屏幕黑屏问题

参考https://cloud.tencent.com/developer/ask/sof/116470494 电脑是联想x1笔记本&#xff0c;显卡是intel的&#xff0c;nvidia显卡好像没看见这种问题。 sudo apt update sudo apt install xserver-xorg打开custom.conf&#xff0c; sudo gedit /etc/gdm3/custom.conf 解…...

沙箱模拟支付宝支付3--支付的实现

1 支付流程实现 演示案例 主要参考程序员青戈的视频【支付宝沙箱支付快速集成版】支付宝沙箱支付快速集成版_哔哩哔哩_bilibili 对应的源码在 alipay-demo: 使用支付宝沙箱实现支付功能 - Gitee.com 以下是完整的实现步骤 1.首先导入相关的依赖 <?xml version"1…...

Golang的代码质量分析工具

Golang的代码质量分析工具 一、介绍 作为一种高效、简洁、可靠的编程语言&#xff0c;被越来越多的开发者所喜爱和采用。而随着项目规模的增长和团队人员的扩大&#xff0c;代码质量的管理变得尤为重要。为了保障代码的可维护性、健壮性和可扩展性&#xff0c;我们需要借助代码…...

【Linux】:多线程(读写锁 自旋锁)

✨ 倘若南方知我意&#xff0c;莫将晚霞落黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#…...

Java开发 PDF文件生成方案

业务需求背景 业务端需要能够将考试答卷内容按指定格式呈现并导出为pdf格式进行存档&#xff0c;作为紧急需求插入。导出内容存在样式复杂性&#xff0c;包括特定的字体&#xff08;中文&#xff09;、字号、颜色&#xff0c;页面得有页眉、页码&#xff0c;数据需要进行表格聚…...

数学期望和方差

数学期望&#xff08;Mathematical Expectation&#xff09;和方差&#xff08;Variance&#xff09;是概率论和统计学中两个非常重要的概念。下面将分别对这两个概念进行解释。 数学期望 数学期望是随机变量的平均值&#xff0c;它描述了随机变量的中心位置。对于离散随机变…...

【面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍Tensor RT 的优化流程。

【面试AI算法题中的知识点】方向涉及&#xff1a;ML/DL/CV/NLP/大数据…本篇介绍Tensor RT 的优化流程。 【面试AI算法题中的知识点】方向涉及&#xff1a;ML/DL/CV/NLP/大数据…本篇介绍Tensor RT 的优化流程。 文章目录 【面试AI算法题中的知识点】方向涉及&#xff1a;ML/D…...

BLDC无感控制的驱动逻辑

如何知道转子已经到达预定位置&#xff0c;因为我们只有知道了转子到达了预定位置之后才能进行换相&#xff0c;这样电机才能顺滑的运转。转子位置检测常用的有三种方式。 方式一&#xff1a;通过过零检测&#xff0c;三相相电压与电机中性点电压进行比较。过零检测的优点在于…...

BP神经网络的反向传播算法

BP神经网络&#xff08;Backpropagation Neural Network&#xff09;是一种常用的多层前馈神经网络&#xff0c;通过反向传播算法进行训练。反向传播算法的核心思想是通过计算损失函数对每个权重的偏导数&#xff0c;从而调整权重&#xff0c;使得网络的预测输出与真实输出之间…...

[实用指南]如何将视频从iPhone传输到iPad

概括 将视频从 iPhone 传输到 iPad 时遇到问题&#xff1f;您可能知道一种方法&#xff0c;但不知道如何操作。此外&#xff0c;您要传输的视频越大&#xff0c;完成任务就越困难。那么如何将视频从 iPhone 传输到 iPad&#xff0c;特别是当您需要发送大视频文件时&#xff1f…...

Linux Snipaste 截图闪屏/闪烁

防 csdn 不能看&#xff0c;Go to juejin Linux Snipaste 截图时窗口元素一闪一闪的无法正常使用。 解决此问题时系统环境为 Manjaro KDE6&#xff0c;不过我在其他发行版与 gnome 上也碰到了。 先放解决办法&#xff1a; # 启动 Snipaste 时去掉缩放参数 env -u QT_SCREEN_…...

【YOLOv5】源码(common.py)

该文件位于/models/common.py&#xff0c;提供了构建YOLOv5模型的各种基础模块&#xff0c;其中包含了常用的功能模块&#xff0c;如自动填充autopad函数、标准卷积层Conv、瓶颈层Bottleneck、C3、SPPF、Concat层等 参考笔记&#xff1a;【YOLOv3】 源码&#xff08;common.py…...

Node 如何生成 RSA 公钥私钥对

一、引入crypto模块 crypto 为node 自带模块&#xff0c;无需安装 const crypto require(crypto);二、封装生成方法 async function generateRSAKeyPair() {return new Promise((resolve, reject) > {crypto.generateKeyPair(rsa, {modulusLength: 2048, // 密钥长度为 …...

瑞_Linux中部署配置Java服务并设置开机自启动

文章目录 背景Linux服务配置步骤并设置开机自启动附-Linux服务常用指令 &#x1f64a; 前言&#xff1a;由于博主在工作时&#xff0c;需要将服务部署到 Linux 服务器上运行&#xff0c;每次通过指令启动服务非常麻烦&#xff0c;所以将 jar 包部署的服务设置开机自启动&#x…...

javaEE-多线程进阶-JUC的常见类

juc:指的是java.util.concurrent包&#xff0c;该包中加载了一些有关的多线程有关的类。 目录 一、Callable接口 FutureTask类 参考代码&#xff1a; 二、ReentrantLock 可重入锁 ReentrantLock和synchronized的区别&#xff1a; 1.ReentantLock还有一个方法&#xff1a…...

Flume拦截器的实现

Flume conf文件编写 vim file_to_kafka.conf#定义组件 a1.sources r1 a1.channels c1#配置source a1.sources.r1.type TAILDIR a1.sources.r1.filegroups f1 a1.sources.r1.filegroups.f1 /Users/zhangjin/model/project/realtime-flink/applog/log/app.* # 设置断点续传…...

Swift Combine 学习(四):操作符 Operator

Swift Combine 学习&#xff08;一&#xff09;&#xff1a;Combine 初印象Swift Combine 学习&#xff08;二&#xff09;&#xff1a;发布者 PublisherSwift Combine 学习&#xff08;三&#xff09;&#xff1a;Subscription和 SubscriberSwift Combine 学习&#xff08;四&…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)

做RAG自己打算使用esmilvus自己开发一个&#xff0c;安装时好像网上没有比较新的安装方法&#xff0c;然后找了个旧的方法对应试试&#xff1a; &#x1f680; 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana&#xff0c;适配中文搜索…...

【笔记】结合 Conda任意创建和配置不同 Python 版本的双轨隔离的 Poetry 虚拟环境

如何结合 Conda 任意创建和配置不同 Python 版本的双轨隔离的Poetry 虚拟环境&#xff1f; 在 Python 开发中&#xff0c;为不同项目配置独立且适配的虚拟环境至关重要。结合 Conda 和 Poetry 工具&#xff0c;能高效创建不同 Python 版本的 Poetry 虚拟环境&#xff0c;接下来…...

day50 随机函数与广播机制

目录 一、随机张量的生成 1.1 torch.randn() 函数 1.2 其他随机函数 1.3 输出维度测试 二、广播机制 2.1 广播机制的规则 2.2 加法的广播机制 二维张量与一维向量相加 三维张量与二维张量相加 二维张量与标量相加 高维张量与低维张量相加 2.3 乘法的广播机制 批量…...