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

Android Compose 图标按钮深度剖析:从源码到实践(五)

Android Compose 图标按钮深度剖析:从源码到实践

一、引言

在现代 Android 应用开发中,用户界面的交互性和美观性至关重要。图标按钮作为一种常见的 UI 元素,以其简洁直观的特点,在提升用户体验方面发挥着重要作用。Android Compose 作为 Google 推出的新一代声明式 UI 工具包,为开发者提供了创建图标按钮的便捷方式。本文将深入 Android Compose 框架的图标按钮模块,从源码级别进行剖析,带领读者了解其内部实现机制,掌握如何灵活运用图标按钮,打造出高质量的 Android 应用界面。

二、Android Compose 基础概述

2.1 Compose 简介

Android Compose 是一种现代的 Android UI 工具包,它采用声明式编程范式,让开发者能够更轻松地构建和管理 UI。与传统的基于视图的 UI 系统相比,Compose 代码更加简洁、易于维护,并且能够自动处理状态变化和布局更新。

2.2 核心概念

  • @Composable 注解:在 Compose 中,使用 @Composable 注解标记的函数被称为可组合函数。这些函数用于描述 UI 的一部分,并且可以相互调用,构建出复杂的 UI 界面。

kotlin

import androidx.compose.runtime.Composable
import androidx.compose.material.Text// 一个简单的可组合函数,用于显示文本
@Composable
fun SimpleText() {Text(text = "Hello, Compose!")
}
  • 状态管理:Compose 提供了强大的状态管理机制,通过 mutableStateOf 函数可以创建可变状态。当状态发生变化时,Compose 会自动重新组合受影响的 UI 部分。

kotlin

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.material.Text@Composable
fun StatefulText() {// 创建一个可变状态,初始值为 "Hello"var text by mutableStateOf("Hello")// 显示文本Text(text = text)// 模拟状态变化text = "World"
}

三、图标按钮概述

3.1 图标按钮的作用

图标按钮在 Android 应用中广泛应用,用于触发特定的操作或提供导航功能。与普通文本按钮相比,图标按钮更加直观,能够在有限的空间内传达明确的信息,提升用户操作的便捷性。

3.2 Android Compose 中的图标按钮组件

在 Android Compose 中,主要使用 IconButton 组件来创建图标按钮。IconButton 提供了简洁的 API,允许开发者轻松地添加图标和处理点击事件。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.runtime.Composable@Composable
fun FavoriteIconButton() {// 创建一个图标按钮IconButton(onClick = { /* 处理点击事件 */ }) {// 显示一个喜欢的图标Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")}
}

四、IconButton 源码分析

4.1 IconButton 组件定义

IconButton 组件的定义位于 androidx.compose.material 包中,以下是简化后的源码:

kotlin

@Composable
fun IconButton(onClick: () -> Unit, // 点击事件处理函数modifier: Modifier = Modifier, // 修饰符,用于修改组件的外观和行为enabled: Boolean = true, // 按钮是否可用interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, // 交互源,用于处理交互状态content: @Composable () -> Unit // 图标内容
) {// 创建一个按钮,使用 Clickable 修饰符处理点击事件Clickable(onClick = onClick,modifier = modifier,enabled = enabled,interactionSource = interactionSource,indication = rememberRipple(bounded = false) // 涟漪效果) {// 应用内边距ProvideTextStyle(value = LocalTextStyle.current) {Box(modifier = Modifier.padding(IconButtonDefaults.IconButtonPadding).then(modifier),contentAlignment = Alignment.Center) {// 显示图标内容content()}}}
}

从上述代码可以看出,IconButton 本质上是一个 Clickable 组件,它接收一个点击事件处理函数 onClick,并通过 content 参数接收图标内容。在内部,使用 Box 组件对图标进行布局,并应用了内边距。

4.2 点击事件处理

IconButton 通过 Clickable 修饰符处理点击事件。Clickable 是 Compose 中用于处理点击交互的基础组件,它接收一个 onClick 函数,并在用户点击时调用该函数。

kotlin

Clickable(onClick = onClick,// 其他参数...
) {// 组件内容
}

4.3 交互状态管理

IconButton 使用 MutableInteractionSource 来管理交互状态,如按下、悬停等。MutableInteractionSource 是一个可观察的数据源,当交互状态发生变化时,会通知所有观察者。

kotlin

val interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }Clickable(// 其他参数...interactionSource = interactionSource,// 其他参数...
) {// 组件内容
}

4.4 涟漪效果实现

IconButton 默认使用 rememberRipple 函数创建涟漪效果。rememberRipple 是一个可组合函数,用于创建一个涟漪动画,当用户点击按钮时,会显示涟漪效果。

kotlin

Clickable(// 其他参数...indication = rememberRipple(bounded = false)
) {// 组件内容
}

五、图标资源的使用

5.1 使用 Material Icons

在 Android Compose 中,可以方便地使用 Material Design 图标库中的图标。Material Icons 提供了丰富的图标资源,涵盖了各种常见的操作和场景。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.runtime.Composable@Composable
fun MaterialIconButton() {IconButton(onClick = { /* 处理点击事件 */ }) {// 使用 Material Icons 中的喜欢图标Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")}
}

5.2 使用自定义图标

除了使用 Material Icons,还可以使用自定义图标。自定义图标可以是本地的图片资源,也可以是 SVG 图标。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.ui.res.painterResource
import androidx.compose.runtime.Composable@Composable
fun CustomIconButton() {IconButton(onClick = { /* 处理点击事件 */ }) {// 使用自定义图标资源Icon(painter = painterResource(id = R.drawable.custom_icon), contentDescription = "Custom Icon")}
}

5.3 图标资源的源码分析

Icon 组件用于显示图标,它接收一个 Painter 对象作为图标资源。Painter 是 Compose 中用于绘制图形的抽象类,painterResource 函数用于从资源文件中加载 Painter 对象。

kotlin

@Composable
fun Icon(painter: Painter, // 图标资源contentDescription: String?, // 图标描述modifier: Modifier = Modifier,tint: Color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
) {// 绘制图标Canvas(modifier) {val scale = size.minDimension / min(painter.intrinsicSize.width, painter.intrinsicSize.height)val translateX = (size.width - painter.intrinsicSize.width * scale) / 2val translateY = (size.height - painter.intrinsicSize.height * scale) / 2withTransform({translate(left = translateX, top = translateY)scale(scale)}) {painter.draw(this, tint)}}
}

六、图标按钮的样式定制

6.1 修改图标颜色

可以通过 tint 参数修改图标按钮中图标的颜色。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.ui.graphics.Color
import androidx.compose.runtime.Composable@Composable
fun ColoredIconButton() {IconButton(onClick = { /* 处理点击事件 */ }) {// 修改图标颜色为红色Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite", tint = Color.Red)}
}

6.2 修改按钮大小

可以通过 Modifier.size 修饰符修改图标按钮的大小。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.runtime.Composable@Composable
fun SizedIconButton() {IconButton(onClick = { /* 处理点击事件 */ },modifier = Modifier.size(48.dp)) {Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")}
}

6.3 修改按钮背景和形状

可以通过 Modifier.background 和 Modifier.clip 修饰符修改按钮的背景和形状。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RoundedCornerShape
import androidx.compose.ui.unit.dp
import androidx.compose.runtime.Composable@Composable
fun StyledIconButton() {IconButton(onClick = { /* 处理点击事件 */ },modifier = Modifier.background(Color.LightGray, RoundedCornerShape(8.dp)).size(48.dp)) {Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")}
}

七、图标按钮的交互处理

7.1 点击事件处理

在 IconButton 中,通过 onClick 参数处理点击事件。当用户点击图标按钮时,会调用该参数传入的函数。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue@Composable
fun ClickableIconButton() {var isFavorite by mutableStateOf(false)IconButton(onClick = {// 处理点击事件,切换喜欢状态isFavorite = !isFavorite}) {Icon(imageVector = if (isFavorite) Icons.Filled.Favorite else Icons.Filled.FavoriteBorder,contentDescription = if (isFavorite) "Unfavorite" else "Favorite")}
}

7.2 长按事件处理

除了点击事件,还可以处理长按事件。可以通过 Modifier.pointerInput 修饰符来监听长按事件。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
import kotlinx.coroutines.launch@Composable
fun LongPressIconButton() {IconButton(onClick = { /* 处理点击事件 */ },modifier = Modifier.pointerInput(Unit) {detectTapGestures(onLongPress = {// 处理长按事件})}) {Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")}
}

7.3 悬停和焦点处理

可以通过 MutableInteractionSource 监听悬停和焦点状态,并根据状态修改图标按钮的样式。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerEnterEventListener
import androidx.compose.ui.input.pointer.pointerExitEventListener@Composable
fun HoverableIconButton() {var isHovered by mutableStateOf(false)IconButton(onClick = { /* 处理点击事件 */ },modifier = Modifier.composed {Modifier.pointerEnterEventListener {isHovered = truefalse}.pointerExitEventListener {isHovered = falsefalse}.alpha(if (isHovered) 0.8f else 1.0f)}) {Icon(imageVector = Icons.Filled.Favorite,contentDescription = "Favorite",tint = if (isHovered) Color.Red else Color.Black)}
}

八、图标按钮的性能优化

8.1 避免不必要的重新组合

在使用图标按钮时,要注意避免不必要的重新组合。可以使用 remember 函数缓存计算结果,避免每次重新组合时都进行重复计算。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember@Composable
fun OptimizedIconButton() {// 缓存图标资源val favoriteIcon = remember { Icons.Filled.Favorite }IconButton(onClick = { /* 处理点击事件 */ }) {Icon(imageVector = favoriteIcon, contentDescription = "Favorite")}
}

8.2 减少组件嵌套

过多的组件嵌套会增加布局的复杂度,影响性能。可以尽量减少不必要的组件嵌套,优化布局结构。

kotlin

// 不推荐的写法,嵌套过多
@Composable
fun NestedIconButton() {Box {IconButton(onClick = { /* 处理点击事件 */ }) {Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")}}
}// 推荐的写法,减少嵌套
@Composable
fun OptimizedNestedIconButton() {IconButton(onClick = { /* 处理点击事件 */ },modifier = Modifier.background(Color.LightGray) // 直接在图标按钮上设置背景颜色) {Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")}
}

九、图标按钮的异常处理

9.1 空指针异常

在使用图标按钮时,要确保传入的参数不为空。例如,onClick 回调函数不能为 null

kotlin

// 错误示例,传入 null 作为 onClick 参数
// IconButton(
//     onClick = null
// ) {
//     Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")
// }// 正确示例,传入有效的 onClick 回调函数
IconButton(onClick = { /* 处理点击事件 */ }
) {Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")
}

9.2 资源加载异常

当使用自定义图标资源时,可能会出现资源加载异常。可以在加载资源时进行异常处理,避免应用崩溃。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.ui.res.painterResource
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.painter.Painter@Composable
fun SafeCustomIconButton() {val customIcon: Painter? = try {painterResource(id = R.drawable.custom_icon)} catch (e: Exception) {null}IconButton(onClick = { /* 处理点击事件 */ }) {if (customIcon != null) {Icon(painter = customIcon, contentDescription = "Custom Icon")} else {// 处理资源加载失败的情况}}
}

十、图标按钮的扩展和定制

10.1 自定义图标按钮组件

可以通过组合现有的组件来创建自定义的图标按钮组件。例如,创建一个带有文字说明的图标按钮。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.unit.dp@Composable
fun IconTextButton(onClick: () -> Unit,icon: @Composable () -> Unit,text: String
) {IconButton(onClick = onClick) {Layout(modifier = Modifier.padding(8.dp),content = {icon()Text(text = text, modifier = Modifier.padding(start = 8.dp))}) { measurables, constraints ->val iconPlaceable = measurables[0].measure(constraints)val textPlaceable = measurables[1].measure(constraints)val width = iconPlaceable.width + textPlaceable.width + 8.dp.toPx().toInt()val height = max(iconPlaceable.height, textPlaceable.height)layout(width, height) {iconPlaceable.placeRelative(0, (height - iconPlaceable.height) / 2)textPlaceable.placeRelative(iconPlaceable.width + 8.dp.toPx().toInt(), (height - textPlaceable.height) / 2)}}}
}@Composable
fun CustomIconTextButton() {IconTextButton(onClick = { /* 处理点击事件 */ },icon = {Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")},text = "Favorite")
}

10.2 自定义交互效果

可以通过自定义 Indication 来实现自定义的交互效果。例如,创建一个带有渐变涟漪效果的图标按钮。

kotlin

import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.runtime.Composable
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.LayoutCoordinates
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.unit.IntSize
import kotlinx.coroutines.launch@Composable
fun CustomIndicationIconButton() {var layoutCoordinates: LayoutCoordinates? = nullIconButton(onClick = { /* 处理点击事件 */ },modifier = Modifier.onGloballyPositioned { layoutCoordinates = it }.pointerInput(Unit) {detectTapGestures(onPress = { offset ->val size = layoutCoordinates?.size ?: IntSize.Zeroval brush = Brush.radialGradient(colors = listOf(Color.Red, Color.Transparent),center = Offset(size.width / 2f, size.height / 2f),radius = size.maxDimension.toFloat())launch {// 模拟涟漪效果for (i in 0..100) {val alpha = 1f - i / 100f// 绘制渐变涟漪drawRipple(brush, alpha, offset)kotlinx.coroutines.delay(10)}}})}) {Icon(imageVector = Icons.Filled.Favorite, contentDescription = "Favorite")}
}fun DrawScope.drawRipple(brush: Brush, alpha: Float, center: Offset) {drawCircle(brush = brush,radius = size.maxDimension,center = center,alpha = alpha)
}

十一、总结与展望

通过对 Android Compose 框架图标按钮的源码分析和实践探索,我们深入了解了图标按钮的实现原理、样式定制、交互处理、性能优化等方面的知识。图标按钮作为 Android 应用中常见的 UI 元素,在提升用户体验方面发挥着重要作用。未来,随着 Android Compose 框架的不断发展,图标按钮可能会提供更多的功能和更好的性能,为开发者带来更便捷的开发体验。开发者可以根据自己的需求,充分利用这些特性,创建出更加美观、易用的图标按钮,打造出高质量的 Android 应用。

相关文章:

Android Compose 图标按钮深度剖析:从源码到实践(五)

Android Compose 图标按钮深度剖析:从源码到实践 一、引言 在现代 Android 应用开发中,用户界面的交互性和美观性至关重要。图标按钮作为一种常见的 UI 元素,以其简洁直观的特点,在提升用户体验方面发挥着重要作用。Android Com…...

【Dive Into Stable Diffusion v3.5】2:Stable Diffusion v3.5原理介绍

【Dive Into Stable Diffusion v3.5】系列博文: 第1篇:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练第2篇:Stable Diffusion v3.5原理介绍 目录 1 前言1.1 扩散模型的原理1.2 损失函数1.3 加噪流程1.4 推理流程1.5 negative pr…...

WPF 布局舍入(WPF 边框模糊 或 像素错位 的问题)

1. 什么是 WPF 布局舍入? 在 WPF 开发过程中,可能会遇到界面模糊、边框错位、文本渲染不清晰等问题。这些现象通常是由于 WPF 采用 设备无关像素(DIP, Device Independent Pixels),在不同 DPI 设置下,UI 元…...

前端-选中pdf中的文字并使用,显示一个悬浮的翻译按钮(本地pdfjs+iframe)不适用textlayer

使用pdfjs移步– vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件) 方案1:获取选择文本内容的最前面的字符坐标的位置(这种写法会导致如果选择超出…...

Mongodb分片模式部署

MongoDB 分片集群部署教程 1. 概述 MongoDB 分片是一种用于处理大规模数据集的集群技术。通过分片,MongoDB 可以将数据分布在多个服务器上,从而提高存储容量和读写性能。本教程将详细介绍如何从零开始部署 MongoDB 分片集群。 介绍 分片集群中主要由三…...

「一起学后端」Nest.js + MySQL 查询方法教学文档

Nest.js MySQL 查询方法教学文档 文章目录 Nest.js MySQL 查询方法教学文档1. 基础 CRUD 操作1.1 创建记录1.2 查询记录1.3 更新记录1.4 删除记录 2. 复杂查询2.1 分页与排序2.2 关联查询(JOIN)2.3 聚合查询2.4 子查询 3. 高级操作3.1 事务处理3.2 Typ…...

基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

【学习笔记】LLM推理与部署

文章目录 1 [LLMs inference] quantization 量化整体介绍(bitsandbytes、GPTQ、GGUF、AWQ)2 [LLMs inference] quantization 量化整体介绍(bitsandbytes、GPTQ、GGUF、AWQ)3 [LLMs serving] openrouter & vllm host LLM 推理服…...

leetcode-134.加油站

油箱容积无限,要求能环岛,说明总共加起来的油是不少于消耗量的,这是唯一一个决定能否环岛的变量,只要油量够,那么必定有一段路是攒油的路,它供给后续的消耗,使得油箱总是不空。 如果油量足够&am…...

companion object和object 从kotlin转java分析

说明 companion object 中 companion类中的方法是普通的方法 在外部类中生成静态变量,静态companion 对象 object MyClass2 中 类中方法是普通方法 在MyClass2中生成静态变量,静态MyClass2对象, 一 companion object 使用 kotlin转java pa…...

检索增强生成(2)本地PDF 本地嵌入模型

from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader PyPDFLoader(file_path)try:do…...

关于TVS管漏电流的问题?

问题描述: 在量产的带电池故事机生产中,工厂产线测试电流时,有1台机器电流比正常机器大10mA左右。 原因分析: 1、分析电路原理图,去除可能出现问题的电压或器件(不影响系统),发现…...

2025前端面试题记录

vue项目目录的执行顺序是怎么样的? 1、package.json   在执行npm run dev时,会在当前目录寻找package.json文件,此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…...

Linux系统docker部署Ollama本地大模型及部署Hugging Face开源模型,ollama相关注意点,非ollama模型创建,模型量化,显存建议

本文主要描述在Linux系统使用docker部署ollama自有模型以及Hugging Face开源模型,也涉及到一些相关注意点,欢迎沟通讨论~ 拉取镜像 拉取ollama最新镜像:docker pull ollama/ollama:latest 运行ollama 执行:docker run -d --res…...

.NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar

示例代码下载:https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文档是现代软件开发的支柱。随着 .NET 9 从 Swashbuckle 转向 Microsoft.AspNetCore.OpenApi,开发人员需要新的策略来保持高效。本文探讨了这些变化,并介…...

C++——权限初识

权限初识 C中的访问权限主要分为三种: public 、 private 和 protected 。这些权限决定了类成员(包括数据成员和成员函数)的可访问性。以下是一个总结表格,说明了在不同情况下这些权限如何应用: 使用权限(…...

如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述

在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…...

如何在 Linux 系统中部署 FTP 服务器:从基础配置到安全优化

一、为什么选择 Linux 部署 FTP 服务器? FTP(文件传输协议)作为互联网最早的文件传输标准,至今仍在企业内部文件共享、镜像站点同步等场景中广泛应用。Linux 系统凭借其稳定性、开源特性及丰富的工具链,成为搭建 FTP 服…...

C++——引用

目录 举个例子: 引用的基本特性 引用的定义语法如下: 1. 引用必须初始化: 2. 引用是别名: 3. 引用不能为空: 4. 引用不能重新绑定: 引用的使用场景 函数参数传递: 函数返回值&#xf…...

unity开发效率提升笔记

本文将记录提升Unity开发效率的若干细节,持续更新 一.VSCode文件标签多行显示 1.File->Preference->Settings (快捷键Ctrl 逗号) 2.搜索workbench.editor.wrapTabs 3.勾选上这个单选开关 若依然不是多行 4.搜索workbench.editor.tabSizing,选择fi…...

VScode页面错误,可以编译C++20版本,但页面显示有错误的解决方案

问题回顾 学习信号量时使用到了C20版本的一些变量,可以正常编译和运行,但在编辑器上显示存在错误,如图所示 显示结果,提示命名空间std没有成员变量counting_semaphore,如图所示 解决办法 1、确保自己安装了C/C插件…...

[WEB开发] JDBC

一. JDBC基础 JDBC (Java DataBase Connectivity): 就是使用 java 语言操作数据库的一套API. JDBC本质: 一套标准接口, 规范各个数据库厂商实现这套接口, 提供驱动使用接口, 真正执行的是实现类 二. 实战 2.1 非预编译sql // 1. 注册数据库驱动Class.forName("com.my…...

Linux shell脚本2-test条件测试语句:文件类型、字符串是否相等、数字大小比较、多重条件判断,测试语句验证

目录 1.条件测试语句 2.文件表达式测试 2.1测试文件状态的条件表达式 2.2程序验证 2.2.1 单个文件验证 2.2.3.两个文件验证 3.字符串表达式测试 4.数字表达式测试 5.复合表达式测试 1.条件测试语句 在写shell脚本时,经常遇到的问题就是判断字符串是否相等&…...

linux_git使用

1. git的历史 git是开源的 2. git的理解 版本控制 只进行管理源文件 3. git的使用 3.1. git命令安装 sudo yum install git sudo apt install -y git 查看是否安装成功 $git --version 3.2. git使用注意事项 首次使用git需要输入用户名和邮件 gitignore&#xff1…...

Linux网络相关概念和重要知识(2)(UDP套接字编程、聊天室的实现、观察者模式)

目录 1.UDP套接字编程 (1)socket编程 (2)UDP的使用 ①socket ②bind ③recvfrom ④sendto 2.聊天室的实现 (1)整体逻辑 (2)对sockaddr_in的封装 (3&#xff09…...

2025年03月18日柯莱特(外包宁德)一面前端面试

目录 自我介绍你怎么从0到1搭建项目的webpack 的构建流程手写webpack插件你有什么想问我的吗 2. 你怎么从 0 到 1 搭建项目的 在面试中回答从 0 到 1 搭建前端项目,可按以下详细步骤阐述: 1. 项目前期准备 需求理解与分析 和产品经理、客户等相关人…...

汇川EASY系列之以太网通讯(MODBUS_TCP做主站)

汇川Easy系列以太网通讯中(MODBUSTCP,plc做主站),终于可以不用使用指令就可以完成了,全程通过简单的配置就可通讯。本文将通过EASY系列PLC与调试助手之间完成此操作。具体演示如下; 关于主站和从站的介绍 A/请求:即主动方 向被动方发送的一个要求的信息。 B/主站:发…...

uni-app jyf-parser将字符串转化为html 和 rich-text

uni-app jyf-parser将字符串转化为html-CSDN博客 方法二: rich-text | uni-app...

PyTorch中Batch Normalization1d的实现与手动验证

PyTorch中Batch Normalization1d的实现与手动验证 一、介绍 Batch Normalization(批归一化)是深度学习中常用的技术,用于加速训练并减少对初始化的敏感性。本文将通过PyTorch内置函数和手动实现两种方式,展示如何对三维输入张量…...

LoRA中黑塞矩阵、Fisher信息矩阵是什么

LoRA中黑塞矩阵、Fisher信息矩阵是什么 1. 三者的核心概念 黑塞矩阵(Hessian) 二阶导数矩阵,用于优化问题中判断函数的凸性(如牛顿法),或计算参数更新方向(如拟牛顿法)。 Fisher信息矩阵(Fisher Information Matrix, FIM) 统计学中衡量参数估计的不确定性,反映数据…...

Transformer中,Fisher矩阵与权重之间关系

Transformer中,Fisher矩阵与权重之间关系 目录 Transformer中,Fisher矩阵与权重之间关系一、Fisher矩阵与Transformer权重的关系二、Fisher矩阵的更新方式三、举例说明给出案例:Transformer权重矩阵,Fisher矩阵,说明对应关系和怎么更新二阶导数计算需要大量算力有什么方法…...

本地安装deepseek大模型,并使用 python 调用

首先进入 ollama 官网 https://ollama.com/点击下载 下载完成后所有都是下一步,就可以 点击搜索 Models : https://ollama.com/search然后点击下载: 选择后复制: ollama run deepseek-r1:32b例如: 让它安装完成后&#xff1…...

asp.net mvc 向前端响应json数据。用到jquery

最近在给客户开发提醒软件时&#xff0c;用asp.net mvc 开发。该框架已经集成了bootstrap,直接贴asp.net mvc 端代码&#xff1a; {Layout null; }<!DOCTYPE html><html> <head><meta name"viewport" content"widthdevice-width" /…...

《基于深度学习的指纹识别智能门禁系统》开题报告

个人主页&#xff1a;大数据蟒行探索者 1研究背景 1.1开发目的和意义 指纹识别作为生物特征识别领域的一项重要技术&#xff0c;在安全认证、犯罪侦查和个人身份验证等方面具有广泛应用前景。随着深度学习技术的迅猛发展&#xff0c;基于深度学习的指纹识别系统成为了当前研究…...

数据预处理流程与关键步骤解析

数据预处理流程图&#xff08;Markdown格式&#xff09;&#xff1a; #mermaid-svg-b3mhJcpFWaJ9qMZ8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-b3mhJcpFWaJ9qMZ8 .error-icon{fill:#552222;}#mermaid-svg-b3m…...

单片机开发资源分析实战——以STM32F103ZET6为例子,分析我们的单片机

目录 第一件事情&#xff1a;为什么叫STM32F103ZET6 分析我们的资源手册 第二件事情&#xff0c;关心我们的GPIO引脚输出 第三件事情&#xff1a;去找对应外设的说明部分 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite ST…...

uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)

文章目录 **主要功能**1. **快速安装和管理 Python 包**2. **生成和管理锁文件 (requirements.lock)**3. **创建虚拟环境**4. **与 poetry 兼容** **核心优势**1. **极快的速度**&#xff1a;基于 Rust 实现&#xff0c;利用多线程和缓存大幅加速依赖解析。2. **轻量且独立**&a…...

React Native进阶(六十):webview实现屏蔽所嵌套web页面异常弹窗

文章目录 一、前言二、解决方案三、注意事项四、拓展阅读 一、前言 在React Native项目集成web页面时&#xff0c;webview嵌套方式是常用方式。如果所嵌套的web页面由于某种不可控因素导致出现错误弹窗信息&#xff0c;webview作为web嵌套方式应该对其行为可控。 React Nativ…...

IS-IS原理与配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO&#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNet…...

响应式CMS架构优化SEO与用户体验

内容概要 在数字化内容生态中&#xff0c;响应式CMS架构已成为平衡搜索引擎可见性与终端用户体验的核心载体。该系统通过多终端适配技术&#xff0c;确保PC、移动端及平板等设备的内容渲染一致性&#xff0c;直接降低页面跳出率并延长用户停留时长。与此同时&#xff0c;智能S…...

mysql 主从配置

核心概念&#xff1a; 主服务器&#xff08;Master&#xff09;&#xff1a;负责处理客户端的写操作&#xff0c;并将数据更改记录到二进制日志&#xff08;binlog&#xff09;中。从服务器&#xff08;Slave&#xff09;&#xff1a;负责读取主服务器的二进制日志&#xff0c;…...

Windows下编译安装Qt5.15.0指南

1. 系统要求 操作系统: Windows 7 或更高版本&#xff08;推荐 Windows 10/11&#xff09;。 磁盘空间: 至少 20-30 GB&#xff08;编译过程会生成大量中间文件&#xff09;。 内存: 建议 8GB 或更高。 编译器: 需要安装 Visual Studio&#xff08;推荐 MSVC 2017 或 MSVC 2…...

001-JMeter的安装与配置

1.前期准备 下载好JMeter : https://jmeter.apache.org/download_jmeter.cgi 下载好JDK : :Java Downloads | Oracle 中国 下载图中圈蓝的JMeter和JDK就行&#xff0c;让它边下载&#xff0c;我们边往下看 2.为什么要下载并安装JDK ? JMeter 是基于 Java 开发的工具&#…...

kube-score K8S Yaml静态代码分析工具详解

kube-score 是一款专注于 Kubernetes 配置文件的静态代码分析工具&#xff0c;旨在通过自动化检查帮助用户识别资源配置中的潜在问题&#xff0c;并遵循最佳实践以提升集群的安全性、稳定性和性能。以下是其核心功能、使用方法和应用场景的详细解析&#xff1a; 一、核心功能与…...

【Go】Go语言结构体笔记

整体介绍 虽然 Go 语言不是传统意义上的面向对象语言&#xff0c;但它提供了结构体&#xff08;struct&#xff09;来组织数据&#xff0c;并且可以为结构体绑定方法&#xff0c;从而达到面向对象的部分效果。 关键知识点包括&#xff1a; 结构体定义与实例化 定义结构体时使用…...

Oracle数据库性能优化全攻略:十大关键方向深度解析与实践指南

文章目录 一、SQL查询优化二、索引优化三、内存管理四、I/O优化五、分区表与分区索引六、并行处理七、统计信息管理八、锁与并发控制九、数据库参数调优十、应用设计优化结论 在当今数据驱动的时代&#xff0c;数据库的性能优化成为了确保企业应用高效运行的关键。Oracle作为业…...

Modern C++面试题及参考答案

目录 解释右值引用的定义及其与左值引用的核心区别 std::move 的实现原理是什么?为什么它本身不执行移动操作? 移动构造函数与拷贝构造函数的调用场景有何不同? 实现一个支持移动语义的类需要遵循哪些原则? 完美转发(Perfect Forwarding)的实现原理及 std::forward 的…...

【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用

一、液晶显示技术简介 1.RGB信号线 RGB是一种色彩模式&#xff0c;是工业界的一种颜色标准&#xff0c;是通过红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;、蓝&#xff08;B&#xff09;三个颜色通道的变化&#xff0c;以及它们相互之间的叠加来得到各式各样的…...

Git push后撤销提交

一、介绍 当某次更改完工程后&#xff0c;push了本地仓库到云端&#xff0c;但是发现有地方改错了&#xff0c;想撤销这次推送&#xff0c;或者某次提交就更改了很小一部分&#xff0c;想和本地这次修改的合并为一次推送&#xff0c;省的在云端显示特别多次提交&#xff0c;显得…...

React多层级对象改变值--immer

reduxjs/toolkit底层就是immer&#xff0c;&#xff0c;&#xff0c;所以在使用redux的时候&#xff0c;直接赋值&#xff0c;就会响应式的数据 如果不使用reduxjs/toolkit,可以自己使用immer来实现 安装immer npm install immer引入produce函数&#xff0c;&#xff0c;prod…...