Kotlin Compose Button 实现长按监听并实现动画效果
想要实现长按按钮开始录音,松开发送的功能。发现 Button 这个控件如果去监听这些按下,松开,长按等事件,发现是不会触发的,究其原因是 Button 已经提前消耗了这些事件所以导致,这些监听无法被触发。因此为了实现这些功能就需要自己写一个 Button 来解决问题。
Button 实现原理
在 Jetpack Compose 中,Button 是一个高度封装的可组合函数(Composable),其底层是由多个 UI 组件组合而成,关键组成包括:Surface、Text、Row、InteractionSource 等
- 源码
@Composable
fun Button(onClick: () -> Unit,modifier: Modifier = Modifier,enabled: Boolean = true,shape: Shape = ButtonDefaults.shape,colors: ButtonColors = ButtonDefaults.buttonColors(),elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),border: BorderStroke? = null,contentPadding: PaddingValues = ButtonDefaults.ContentPadding,interactionSource: MutableInteractionSource? = null,content: @Composable RowScope.() -> Unit
) {@Suppress("NAME_SHADOWING")val interactionSource = interactionSource ?: remember { MutableInteractionSource() }val containerColor = colors.containerColor(enabled)val contentColor = colors.contentColor(enabled)val shadowElevation = elevation?.shadowElevation(enabled, interactionSource)?.value ?: 0.dpSurface(onClick = onClick,modifier = modifier.semantics { role = Role.Button },enabled = enabled,shape = shape,color = containerColor,contentColor = contentColor,shadowElevation = shadowElevation,border = border,interactionSource = interactionSource) {ProvideContentColorTextStyle(contentColor = contentColor,textStyle = MaterialTheme.typography.labelLarge) {Row(Modifier.defaultMinSize(minWidth = ButtonDefaults.MinWidth,minHeight = ButtonDefaults.MinHeight).padding(contentPadding),horizontalArrangement = Arrangement.Center,verticalAlignment = Alignment.CenterVertically,content = content)}}
}
1. Surface 的作用(关键)
Surface 是 Compose 中的通用容器,负责:
- 提供背景颜色(来自 ButtonColors)
- 提供 elevation(阴影)
- 提供点击行为(通过 onClick)
- 提供 shape(圆角、裁剪等)
- 提供 ripple 效果(内部自动通过 indication 使用 rememberRipple())
- 使用 Modifier.clickable 实现交互响应
注意:几乎所有 Material 组件都会使用 Surface
来包裹内容,统一管理视觉表现。
2. InteractionSource
InteractionSource
是 Compose 中管理用户交互状态的机制(如pressed
、hovered
、focused
)Button
将其传入Surface
,用于响应和处理 ripple 动画等- 与
MutableInteractionSource
配合,可以观察组件的状态变化
3. ButtonDefaults
ButtonDefaults
是提供默认值的工具类,包含:
elevation()
:返回ButtonElevation
对象,用于设置不同状态下的阴影高度buttonColors()
:返回ButtonColors
对象,用于设置正常 / 禁用状态下的背景与文字颜色ContentPadding
:内容的默认内边距
4. Content Slot(RowScope.() -> Unit
)
Button
的 content
是一个 RowScope
的 lambda,允许你自由组合子组件,如:
Button(onClick = { }) {Icon(imageVector = Icons.Default.Add, contentDescription = null)Spacer(modifier = Modifier.width(4.dp))Text("添加")
}
因为是在 RowScope
中,所以能用 Spacer
等布局函数在水平排列子项。
关键点 | 说明 |
---|---|
Surface | 提供背景、阴影、圆角、点击、ripple 效果的统一封装 |
InteractionSource | 用于收集用户交互状态(点击、悬停等) |
ButtonDefaults | 提供默认颜色、阴影、Padding 等参数 |
Row + Text | 内容布局,允许图标 + 文本灵活组合 |
Modifier | 控制尺寸、形状、边距、点击响应等 |
如果想自定义 Button
的样式,也可以直接使用 Surface
+ Row
自己实现一个“按钮”,只需照着官方的做法组装即可。
@Suppress("DEPRECATION_ERROR")
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Button(onClick: () -> Unit = {},onLongPress: () -> Unit = {},onPressed: () -> Unit = {},onReleased: () -> Unit = {},modifier: Modifier = Modifier,enabled: Boolean = true,shape: Shape = ButtonDefaults.shape,colors: ButtonColors = ButtonDefaults.buttonColors(),border: BorderStroke? = null,shadowElevation: Dp = 0.dp,contentPadding: PaddingValues = ButtonDefaults.ContentPadding,content: @Composable RowScope.() -> Unit = { Text("LongButton") }
) {val containerColor = colors.containerColorval contentColor = colors.contentColorSurface(modifier = modifier.minimumInteractiveComponentSize().pointerInput(enabled) {detectTapGestures(onPress = { offset ->onPressed()tryAwaitRelease()onReleased()},onTap = { onClick() },onLongPress = { onLongPress() })}.semantics { role = Role.Button },shape = shape,color = containerColor,contentColor = contentColor,shadowElevation = shadowElevation,border = border,) {CompositionLocalProvider(LocalContentColor provides contentColor,LocalTextStyle provides LocalTextStyle.current.merge(MaterialTheme.typography.labelLarge),) {Row(Modifier.defaultMinSize(ButtonDefaults.MinWidth, ButtonDefaults.MinHeight).padding(contentPadding),horizontalArrangement = Arrangement.Center,verticalAlignment = Alignment.CenterVertically,content = content)}}
}
Button 的动画实现
为了让按钮在按下时提供自然的视觉反馈,Compose 通常会使用状态驱动的动画。最常见的方式是通过 animateColorAsState
来实现颜色的平滑过渡,比如按钮被按下时背景色或文字颜色稍微变暗,松开时再恢复。
这个动画实现的关键点在于:
- 交互状态:比如是否按下、是否禁用,可以通过
InteractionSource
结合collectIsPressedAsState()
实时监听当前状态。 - 根据状态决定目标颜色:当状态变化时(如按下 -> 松开),我们会设置新的目标颜色。
- 使用动画驱动状态变化:通过
animateColorAsState()
把颜色变化变成带过渡效果的状态变化,而不是突变。
这种方式符合 Compose 的声明式编程模型,不需要手动写动画过程,而是让状态驱动 UI 动画。
下面是按钮颜色动画部分的代码片段,只展示相关的状态监听和动画逻辑,具体如何应用在 UI 中将在后续实现:
@Composable
fun AnimatedButtonColors(enabled: Boolean,interactionSource: InteractionSource,defaultContainerColor: Color,pressedContainerColor: Color,disabledContainerColor: Color
): State<Color> {val isPressed by interactionSource.collectIsPressedAsState()val targetColor = when {!enabled -> disabledContainerColorisPressed -> pressedContainerColorelse -> defaultContainerColor}// 返回一个状态驱动的动画颜色val animatedColor by animateColorAsState(targetColor, label = "containerColorAnimation")return rememberUpdatedState(animatedColor)
}
值得一提的是,Button 使用的动画类型为 ripple (涟漪效果)
这段代码仅负责计算当前的按钮背景色,并通过动画使其平滑过渡。它不会直接控制按钮的点击或布局逻辑,而是为最终的 UI 提供一个可动画的颜色状态。
后续可以将这个 animatedColor
应用于 Surface
或背景 Modifier 上,完成整体的按钮外观动画。
完整动画代码
// 1. 确保 interactionSource 不为空
val interaction = interactionSource ?: remember { MutableInteractionSource() }
// 2. 监听按下状态
val isPressed by interaction.collectIsPressedAsState()// 4. 按状态选 target 值
val defaultContainerColor = colors.containerColor
val disabledContainerColor = colors.disabledContainerColor
val defaultContentColor = colors.contentColor
val disabledContentColor = colors.disabledContentColorval targetContainerColor = when {!enabled -> disabledContainerColorisPressed -> defaultContainerColor.copy(alpha = 0.85f)else -> defaultContainerColor
}
val targetContentColor = when {!enabled -> disabledContentColorisPressed -> defaultContentColor.copy(alpha = 0.9f)else -> defaultContentColor
}// 5. 动画
val containerColorAni by animateColorAsState(targetContainerColor, label = "containerColor")
val contentColorAni by animateColorAsState(targetContentColor, label = "contentColor")// 涟漪效果
// 根据当前环境选择是否使用新版 Material3 的 ripple(),还是退回到老版的 rememberRipple() 实现
val ripple = if (LocalUseFallbackRippleImplementation.current) {rememberRipple(true, Dp.Unspecified, Color.Unspecified)
} else {ripple(true, Dp.Unspecified, Color.Unspecified)
}// 6. Surface + 手动发 PressInteraction
Surface(modifier = modifier.minimumInteractiveComponentSize().pointerInput(enabled) {detectTapGestures(onPress = { offset ->// 发起 PressInteraction,供 collectIsPressedAsState 监听val press = PressInteraction.Press(offset)val scope = CoroutineScope(coroutineContext)scope.launch {interaction.emit(press)}// 用户 onPressedonPressed()// 等待手指抬起或取消tryAwaitRelease()// 发 ReleaseInteractionscope.launch {interaction.emit(PressInteraction.Release(press))}// 用户 onReleasedonReleased()},onTap = { onClick() },onLongPress = { onLongPress() })}.indication(interaction, ripple).semantics { role = Role.Button },shape = shape,color = containerColorAni,contentColor = contentColorAni,shadowElevation = shadowElevation,border = border,
) {...}
这个 Button 的动画部分主要体现在按下状态下的颜色过渡。它通过 animateColorAsState
来实现背景色和文字颜色的动态变化。
当按钮被按下时,会使用 interaction.collectIsPressedAsState()
实时监听是否处于 Pressed 状态,进而动态计算目标颜色(targetContainerColor
和 targetContentColor
)。按下状态下颜色会降低透明度(背景 alpha = 0.85,文字 alpha = 0.9),形成按压视觉反馈。
颜色的渐变不是突变的,而是带有过渡动画,由 animateColorAsState
自动驱动。它会在目标颜色发生变化时,通过内部的动画插值器平滑过渡到目标值,用户无需手动控制动画过程。
使用 by animateColorAsState(...)
得到的是 State<Color>
类型的值,它会在颜色变化时自动重组,使整个按钮在交互中呈现更自然的过渡效果。
这种方式相比传统手动实现动画更简洁、声明性更强,也更容易和 Compose 的状态系统集成。
完整代码
// androidx.compose.material3: 1.3.0
import androidx.compose.animation.animateColorAsState
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.indication
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.PressInteraction
import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.LocalUseFallbackRippleImplementation
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.role
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlin.coroutines.coroutineContext@Suppress("DEPRECATION_ERROR")
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Button(onClick: () -> Unit = {},onLongPress: () -> Unit = {},onPressed: () -> Unit = {},onReleased: () -> Unit = {},modifier: Modifier = Modifier,enabled: Boolean = true,shape: Shape = ButtonDefaults.shape,colors: ButtonColors = ButtonDefaults.buttonColors(),border: BorderStroke? = null,shadowElevation: Dp = 0.dp,contentPadding: PaddingValues = ButtonDefaults.ContentPadding,interactionSource: MutableInteractionSource? = null,content: @Composable RowScope.() -> Unit = { Text("LongButton") }
) {// 1. 确保 interactionSource 不为空val interaction = interactionSource ?: remember { MutableInteractionSource() }// 2. 监听按下状态val isPressed by interaction.collectIsPressedAsState()// 4. 按状态选 target 值val defaultContainerColor = colors.containerColorval disabledContainerColor = colors.disabledContainerColorval defaultContentColor = colors.contentColorval disabledContentColor = colors.disabledContentColorval targetContainerColor = when {!enabled -> disabledContainerColorisPressed -> defaultContainerColor.copy(alpha = 0.85f)else -> defaultContainerColor}val targetContentColor = when {!enabled -> disabledContentColorisPressed -> defaultContentColor.copy(alpha = 0.9f)else -> defaultContentColor}// 5. 动画val containerColorAni by animateColorAsState(targetContainerColor, label = "containerColor")val contentColorAni by animateColorAsState(targetContentColor, label = "contentColor")// 涟漪效果// 根据当前环境选择是否使用新版 Material3 的 ripple(),还是退回到老版的 rememberRipple() 实现val ripple = if (LocalUseFallbackRippleImplementation.current) {rememberRipple(true, Dp.Unspecified, Color.Unspecified)} else {ripple(true, Dp.Unspecified, Color.Unspecified)}// 6. Surface + 手动发 PressInteractionSurface(modifier = modifier.minimumInteractiveComponentSize().pointerInput(enabled) {detectTapGestures(onPress = { offset ->// 发起 PressInteraction,供 collectIsPressedAsState 监听val press = PressInteraction.Press(offset)val scope = CoroutineScope(coroutineContext)scope.launch {interaction.emit(press)}// 用户 onPressedonPressed()// 等待手指抬起或取消tryAwaitRelease()// 发 ReleaseInteractionscope.launch {interaction.emit(PressInteraction.Release(press))}// 用户 onReleasedonReleased()},onTap = { onClick() },onLongPress = { onLongPress() })}.indication(interaction, ripple).semantics { role = Role.Button },shape = shape,color = containerColorAni,contentColor = contentColorAni,shadowElevation = shadowElevation,border = border,) {CompositionLocalProvider(LocalContentColor provides contentColorAni,LocalTextStyle provides LocalTextStyle.current.merge(MaterialTheme.typography.labelLarge),) {Row(Modifier.defaultMinSize(ButtonDefaults.MinWidth, ButtonDefaults.MinHeight).padding(contentPadding),horizontalArrangement = Arrangement.Center,verticalAlignment = Alignment.CenterVertically,content = content)}}
}
相关文章:
Kotlin Compose Button 实现长按监听并实现动画效果
想要实现长按按钮开始录音,松开发送的功能。发现 Button 这个控件如果去监听这些按下,松开,长按等事件,发现是不会触发的,究其原因是 Button 已经提前消耗了这些事件所以导致,这些监听无法被触发。因此为了…...
SQL练习——(15/81)
目录 1.计算次日留存率 2.多条件查询 方法1:子查询 方法2:窗口函数实现 3.条件查询——自连接相关 1.计算次日留存率 550. 游戏玩法分析 IV - 力扣(LeetCode) 错误查询1:(没有考虑从首次登录日期开始…...
数据中心 智慧机房解决方案
该文档介绍数据中心智慧机房解决方案,涵盖模块化数据中心(机柜式、微模块),具备低成本快速部署、标准化建设等特点;监控管理系统(DCIM)可实现设施、资产、容量、能效管理;节能解决方案含精密空调节能控制柜,节能率高达 30%;还有7X24 小时云值守运维服务。方案亮点包括…...
网络-MOXA设备基本操作
修改本机IP和网络设备同网段,输入设备IP地址进入登录界面,交换机没有密码,路由器密码为moxa 修改设备IP地址 交换机 路由器 环网 启用Turbo Ring协议:在设备的网络管理界面中,找到环网配置选项,启用Turb…...
Docker构建 Dify 应用定时任务助手
概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案,用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰,本工具可以帮助设置自动执行任务并获取实时通知,优化你的工作效率。 注意&…...
前端测试策略:单元测试到 E2E 测试
引言 在现代前端开发中,测试已成为确保应用质量和可靠性的关键环节。随着前端应用复杂度的不断提高,仅依靠手动测试已经远远不够。一个全面的前端测试策略应该包含多个层次的测试,从最小粒度的单元测试到模拟真实用户行为的端到端(E2E)测试。…...
Web漏洞扫描服务的特点与优势:守护数字时代的安全防线
在数字化浪潮中,Web应用程序的安全性已成为企业业务连续性和用户信任的核心要素。随着网络攻击手段的不断升级,Web漏洞扫描服务作为一种主动防御工具,逐渐成为企业安全体系的标配。本文将从特点与优势两方面,解析其价值与应用场景…...
大中型水闸安全监测系统解决方案
一、系统概述 水闸是重要的水利基础设施,具有防洪、挡潮、排涝、灌溉、供水、生态、航运和水力发电等综合功能,在国家水网构建、支撑经济社会高质量发展等方面具有十分重要的作用。我国水闸工程面广量大,据2021年统计数据,我国已建…...
紫光同创FPGA实现AD9238数据采集转UDP网络传输,分享PDS工程源码和技术支持和QT上位机
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的以太网方案本方案在Xilinx系列FPGA的应用方案 3、设计思路框架工程设计原理框图AD输入源AD9238数据采集AD9238数据缓存控制模块…...
ffmpeg 把一个视频复制3次
1. 起因, 目的: 前面我写过,使用 python 把一个视频复制3次但是速度太慢了,我想试试看能否改进。而且我想换一种新的视频处理思路,并试试看速度如何。 2. 先看效果 效果就是能行,而且速度也快。 3. 过程: 代码 1…...
仿腾讯会议——添加音频
1、实现开启或关闭音频 2、 定义信号 3、实现开始暂停音频 4、实现信号槽连接 5、回收资源 6、初始化音频视频 7、 完成为每个人创建播放音频的对象 8、发送音频 使用的是对象ba,这样跨线程不会立刻回收,如果使用引用,跨线程会被直接回收掉&a…...
从零训练一个大模型:DeepSeek 的技术路线与实践
从零训练一个大模型:DeepSeek 的技术路线与实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 从零训练一个大模型:DeepSeek 的技术路线与实践摘要引言技术路线对比1. 模型架构:…...
interface接口和defer场景分析
接口 接口这里主要两点: 设计业务结构时采用依赖倒转:业务层向下依赖抽象层,实现层向上依赖抽象层。 相比于之前: 之后: 注意struct中嵌套interface和不嵌套interface的区别: type Myinterface interfac…...
【数据结构篇】排序1(插入排序与选择排序)
注:本文以排升序为例 常见的排序算法: 目录: 一 直接插入排序: 1.1 基本思想: 1.2 代码: 1.3 复杂度: 二 希尔排序(直接插入排序的优化): 2.1 基本思想…...
FastAPI自定义异常处理:优雅转换Pydantic校验错误
FastAPI自定义异常处理:优雅转换Pydantic校验错误 背景需求 当使用FastAPI开发API服务时,Pydantic的自动校验异常默认会返回如下格式的422响应: {"detail": [{"type": "missing","loc": ["body", "user", &…...
C++--内存管理
内存管理 1. C/C内存分布 在C语言阶段,常说局部变量存储在栈区,动态内存中的数据存储在堆区,静态变量存储在静态区(数据段),常量存储在常量区(代码段),其实这里所说的栈…...
YOLOV3 深度解析:目标检测的高效利器
在计算机视觉领域,目标检测一直是一个重要且热门的研究方向,广泛应用于安防监控、自动驾驶、机器人视觉等诸多场景。YOLO(You Only Look Once)系列算法凭借其出色的实时性和较高的检测精度,在目标检测领域占据着重要地…...
select * from 按时间倒序排序
在SQL中,如果你想要根据时间字段来倒序排序查询结果,你可以使用ORDER BY子句,并结合DESC关键字来实现这个目的。这里有几个常见的场景和示例,假设我们有一个表events,里面包含一个时间戳字段event_time。 示例1&#…...
数据结构-DAY06
一、树的概念 1.链表是数的一部分(斜树) 2.树的查找速度很快 3.层序:前序:根左右 中序:左根右 后序: 左右根 4.树的存储:顺序结构,链式结构 5.特点: 1…...
JavaWeb:SpringBoot处理全局异常(RestControllerAdvice)
问题 GlobalExceptionHandler 小结...
免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了
1. 概览 1.1 快速了解 PawSQL PawSQL是专注于数据库性能优化的企业级工具,解决方案覆盖SQL开发、测试、运维的整个流程,提供智能SQL审核、查询重写优化及自动化巡检功能,支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库及达梦、金仓…...
buuctf RSA之旅
BUUCTF-RSA的成长之路 rsarsaRSA1RSA3RSA2RSARSAROLLDangerous RSA[GUET-CTF2019]BabyRSArsa2RSA5[NCTF2019]childRSA[HDCTF2019]bbbbbbrsaRSA4[BJDCTF2020]rsa_output[BJDCTF2020]RSA[WUSTCTF2020]babyrsa[ACTF新生赛2020]crypto-rsa0[ACTF新生赛2020]crypto-rsa3[GWCTF 2019]…...
javascript 编程基础(2)javascript与Node.js
文章目录 一、Node.js 与 JavaScript1、基本概念1.1、JavaScript:动态脚本语言1.2、Node.js:JavaScript 运行时环境 2、核心区别3、执行环境差异3.1、浏览器中的JavaScript3.2、Node.js中的JavaScript 4、共同点5、为什么需要Node.js? 一、No…...
IDEA+AI 深度融合:重构高效开发的未来模式
在 Java 开发领域,IntelliJ IDEA(以下简称 IDEA)作为最受欢迎的集成开发环境之一,一直是开发者的得力工具。而飞算 JavaAI 凭借强大的人工智能技术,为 Java 开发带来了全新的效率提升可能。当 IDEA 与飞算 JavaAI 深度…...
深度学习中常见损失函数激活函数
损失函数 一、分类任务损失函数 二、回归任务损失函数 三、生成对抗网络(GAN)损失函数 四、其他专用损失函数 五、损失函数选择原则 任务类型:分类用交叉熵,回归用MSE/MAE。 数据分布:类别不平衡时选择Focal Loss或…...
入职软件开发与实施工程师了后........
时隔几个月没有创作的我又回来了,这几个月很忙,我一直在找工作,在自考(顺便还处理了一下分手的事),到处奔波,心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生,做我不愿意做的普通…...
告别Spring AI!我的Java轻量AI框架实践(支持多模型接入|注解式MCP架构|附开源地址)
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 1. 开发初衷 \quad 大家好,我是犬余,之前,为了体验一下MCP架构的JAVA实现,犬余使用了Spring AI框…...
【软考-架构】15、软件架构的演化和维护
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 软件架构演化和定义面向对象软件架构演化软件架构演化方式的分类软件架构演化原则软件架构演化评估方法大型网站架构演化软件架构维护 软件架构演化和定义 软件架构生命周…...
编译Qt5.15.16并启用pdf模块
编译Qt5.15.16并启用pdf模块 标题1.目录设置 -q-bulid –qt-everywhere-src-5.15.16 –bulid cd bulid 必须,否则会提示Project ERROR: You cannot configure qt separately within a top-level build. create .qmake.stash and .qmake.super in build folder …...
spring中的EnvironmentPostProcessor接口详解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 EnvironmentPostProcessor 是 Spring Boot 提供的一个关键扩展接口,允许开发者在 Spring 应用环境初始化后、应用上下文创建前&…...
自学嵌入式 day20-数据结构 链表
注:gdb调试工具用法 3.链表的常规操作 (6)尾部插入 int InsertTailLinkList(LinkList* ll, DATATYPE* data) { if (IsEmptyLinkList(ll))//判断链表是否为空 { return InsertHeadLinkList(ll, data); } else { …...
Java设计模式之外观模式:从入门到精通(保姆级教程)
外观模式是结构型设计模式中非常实用的一种,它为复杂的子系统提供了一个统一的简化接口。本文将全面深入地剖析外观模式,从基础概念到高级应用,通过丰富的代码示例、图表和日常生活类比,帮助您彻底掌握这一模式。 一、外观模式基础概念 1.1 什么是外观模式? 外观模式(…...
Ubuntu 20.04 postgresql
安装命令 $ sudo apt-get update $ sudo apt-get install -y postgresql查看postgresql版本 $ psql --version psql (PostgreSQL) 12.22 (Ubuntu 12.22-0ubuntu0.20.04.3)查看系统用户组是否存在postgres $ getent group postgres postgres:x:115: $ getent passwd postgres…...
游戏引擎学习第295天:堆叠房间用于Z层调试
关于确定哪些系统影响许多其他系统,并尽早将其固定下来 目前我们的游戏开发已经进入了一个关键阶段,我们觉得是时候来彻底解决 Z(深度)相关的问题了。之前我们在 Z 轴的处理上做了一些尝试,但始终没有一个明确的定论&…...
【Python 算法零基础 4.排序 ② 冒泡排序】
目录 一、引言 二、算法思想 三、时间复杂度和空间复杂度 1.时间复杂度 2.空间复杂度 四、冒泡排序的优缺点 1.算法的优点 2.算法的缺点 五、实战练习 88. 合并两个有序数组 算法与思路 ① 合并数组 ② 冒泡排序 2148. 元素计数 算法与思路 ① 排序 ② 初始化计数器 ③ 遍历数组…...
【工具】Windows|外接的显示器怎么用软件调亮度(Brightness Slider)
文章目录 工具安装及使用Twinkle Tray:Brightness Slider补充背景知识1. DDC/CI(Display Data Channel Command Interface)2. WMI(Windows Management Instrumentation)3. Twinkle Tray如何结合两者?对比总…...
1.3.3 数据共享、汇聚和使用中的安全目标
探索数据共享、汇聚与使用中的安全目标 在当今数字化时代,数据的价值愈发凸显,数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而,在这一过程中,数据安全至关重要,我们需要明确并保障保密性、完整性…...
【QT】类A和类B共用类C
当类A和类B需要操作同一个输入框时,需要采用共享实例的设计模式。以下是具体实现方案: 1. 核心实现思路 #mermaid-svg-cdmYFhkgOZ5C0uI5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cdmYF…...
《算法导论(第4版)》阅读笔记:p86-p90
《算法导论(第4版)》学习第 19 天,p83-p85 总结,总计 3 页。 一、技术总结 无。 二、英语总结(生词:2) 1. inkling (1)inkling: inclen(“utter in an undertone,低声说话”) c. a hint(提示);a slight knowledg…...
AI在网络安全中的应用之钓鱼邮件检测
0x01 前言 为什么写这个呢,源自于我之前在某教培网站留了信息,不出意外的个人信息泄露的飞快,邮箱开始疯狂收到垃圾邮件甚至钓鱼邮件,看着每天的拦截消息,就在想这个拦截机制挺好玩的,拦截器是怎么知道是不…...
游戏引擎学习第294天:增加手套
准备战斗 我们正在进行的是第294天的开发,目前暂时没有特别确定要做的内容,但我们决定继续研究移动模式相关的部分。虽然一些小型实体系统已经在运行,但并不确定最终效果如何。 今天我们决定实现一个全新的功能:战斗系统。这是游…...
[架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十)
[架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十) 一、痛点 你是否经历过这些场景? 数据库字段频繁变更,维护文档耗时费力用Excel维护表结构,版本混乱难以追溯手动编写Word文档&#…...
5个开源MCP服务器:扩展AI助手能力,高效处理日常工作
AI大语言模型(如Claude、GPT)尽管强大,但其原生形态仅限于文本对话,无法直接与外部世界交互。这一局限严重制约了AI在实际应用场景中的价值发挥 - 无法主动获取实时数据、无法操作外部系统、无法访问用户私有资源。 MCPÿ…...
服务器的基础知识
什么是服务器 配置牛、运行稳、价格感人的高级计算机,家用电脑不能比拟的。 服务器的组成:电源、raid卡、网卡、内存、cpu、主板、风扇、硬盘。 服务器的分类 按计算能力分类 超级计算机 小型机AIX x86服务器(服务器cpu架构) …...
bisheng系列(二)- 本地部署(前后端)
一、导读 环境:Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景:需要bisheng二开商用,故而此处进行本地部署,便于后期调试开发 时间:20250519 说明:bisheng前后…...
华为ODgolang后端一面面经
MySQL死锁是怎么产生的? 假如有一条SQL语句执行了非常久,你会怎么优化呢? explain 索引什么情况下会失效? InnoDB和MyISAM引擎的区别是什么? 为什么是三次握手 避免历史连接 同步双方初始序列号避免资源浪费 为什么…...
UE5 GAS框架解析内部数据处理机制——服务器与客户端
当, gas通过点击鼠标光标触发事件时,内部的处理机制。 当通过点击事件,命中中目标时, 可获取到对应的TargetData 目标数据。处理相应的操作。 仅有本地的客户端的情况下。命中并不会有什么异常。 当存在服务器时, 服…...
《打造第二大脑》
序 第二大脑,前景无限 2025/05/08 发表想法 是的说的太对了,关键是之前自己一直在找如何能避免出现此问题的方法,今天终于看到了本书所讲的的内容 原文:我们耗费了无数的时间阅读、倾听和观摩他人提供的处世原则、思考方式以及生活…...
Word2Vec详解
目录 Word2Vec 一、Word2Vec 模型架构 (一)Word2Vec 的核心理念 (二)Word2Vec 的两种架构 (三)负采样与层次 Softmax (四)Word2Vec 的优势与局限 二、Word2Vec 预训练及数据集…...
[特殊字符] Word2Vec:将词映射到高维空间,它到底能解决什么问题?
一、在 Word2Vec 之前,我们怎么处理语言? 在 Word2Vec 出现之前,自然语言处理更多是“工程方法”,例如字符串匹配、关键词提取、正则规则...。但这些表示通常缺乏语义,词与词之间看不出任何联系以及非常浅显。当然,技术没有好坏,只有适合的场景。例如: 关键词匹配非常…...