HarmonyOS应用开发实战:猫猫大作战-预定义动画概念、AnimationPlayer 播放控制、与运行时 animateTo 的差异、Lotti
前言前面我们用animateTo/animation/Spring做了运行时计算动画——每次都从当前值补间到目标值。但有种「预定义」场景设计师在 Ptools/设计器里做出一段完整动画关键帧序列、多属性协同、贝塞尔曲线导出为.json资源开发者播放它就行——不用复算补间。HarmonyOS 的Hero Style Player或AnimationPlayer/Lottie机制就是播放预定义动画的 API。本篇以「猫猫大作战」开场 Logo 多属性协同动画、连击火焰特效为预演场景把预定义动画概念、AnimationPlayer 播放控制、与运行时 animateTo 的差异、Lottie 矢量动画四大要点讲透。提示本系列不讲 ArkTS 基础语法与环境搭建假设你已跟完第 1–59 篇。本篇是阶段三第十篇阶段三收尾。一、场景拆解开场 Logo 与连击火焰「猫猫大作战」当前开场第 32 篇是主菜单瞬现——玩家想开场 Logo 多属性协同动画0–300msLogo 从 scale 0 旋转 180° 放大到 1。300–600msLogo 上下振荡 3 次弹簧。600–1000ms副标题从 opacity 0 淡入向上滑 20px。这种多属性、多段、贝塞尔曲线的复杂动画用animateTo串联要写很多代码——设计师在 Ptools 做好后导出.json开发者播放即可// 预演开场 Logo 播放预定义动画 import { AnimationPlayer, AnimationOptions } from kit.ArkUI; private logoPlayer: AnimationPlayer | null null; aboutToAppear() { // 加载预定义动画资源 this.logoPlayer AnimationPlayer.create({ resource: resources/raw/logo_animation.json // 设导出的关键帧序列 }); } Builder MainMenuView() { Column() { Image(resources/raw/logo.png) .width(200).height(200) . onComplete(() { // 图片加载完播放动画 this.logoPlayer?.play(); }) /* ... 其他主菜单 ... */ } }核心问题预定义动画 vs 运行时 animateTo 有什么不同AnimationPlayer怎么加载资源、播放、暂停、终止多段关键帧序列怎么定义Lottie 矢量动画和位图动画的区别二、预定义动画概念2.1 什么是预定义动画预定义动画是设计师在设计器Ptools、AE、LottieFiles 等里做好的完整动画描述导出为.json资源——包含关键帧序列每个时刻的属性值。多属性协同scale、rotate、opacity、position 同时变。贝塞尔曲线精确缓动。多段串联0–300ms 放大、300–600ms 振荡、600–1000ms 淡入。开发者播放这个资源即可不用复算补间——动画内容在资源里代码只管「何时播、播几次、暂停/终止」。2.2 与运行时 animateTo 的差异维度运行时 animateTo预定义 Hero Style Player动画内容代码里写补间目标设师在资源里定义多段串联onFinish 串联多次调资源内关键帧序列多属性协同多次 animateTo 各管各资源内同时定义贝塞尔曲线用 Curve 枚举或 ICurve资源内精确贝塞尔代码量多每段都写少只播资源适合「数据驱动」补间「设计师做」复杂特效关键经验「数据驱动补间」用 animateTo「设计师做的复杂特效」用预定义 Player——得分弹跳数据驱动用 animateTo开场 Logo 设计师做用 Player。2.3 资源格式预定义动画资源常见两种格式内容来源关键帧 JSON属性×时刻的数值表Ptools/设计器导出Lottie JSON矢量图形 关键帧AE Bodymovin 插件三、AnimationPlayer 播放控制3.1 创建与加载import { AnimationPlayer, AnimationOptions } from kit.ArkUI; private logoPlayer: AnimationPlayer | null null; aboutToAppear() { this.logoPlayer AnimationPlayer.create({ resource: resources/raw/logo_animation.json, // 资源路径 container: this.logoImageRef // 绑到组件可选 }); }3.2 播放控制 API// 播放 this.logoPlayer.play(); // 暂停 this.logoPlayer.pause(); // 终止 this.logoPlayer.cancel(); // 重置到起始 this.logoPlayer.reset(); // 跳到指定时刻ms this.logoPlayer.seekTo(500); // 指定从 500ms 开始播 this.logoPlayer.playFrom(500);3.3 播放选项this.logoPlayer.play({ iterations: 1, // 播放次数-1 无限 playMode: PlayMode.Normal, // 正放/倒放/交替 duration: -1, // 速率-1 用资源内时长 onStart: () { console.info(开始播); }, onFinish: () { console.info(播完); }, onCancel: () { console.info(被终止); } });3.4 播放状态查询// 当前状态 const state this.logoPlayer.state; // Playing/Paused/Stopped // 当前时刻 const time this.logoPlayer.currentTime; // ms // 总时长 const total this.logoPlayer.duration; // ms四、多段关键帧序列4.1 资源内的关键帧设计师在资源里定义多段关键帧简化示例 JSON{ duration: 1000, keyframes: { scale: [ { time: 0, value: 0 }, { time: 300, value: 1, curve: easeOut } ], rotate: [ { time: 0, value: -180 }, { time: 300, value: 0, curve: easeOut } ], translateY: [ { time: 300, value: 0 }, { time: 400, value: -10, curve: spring }, { time: 500, value: 0, curve: spring }, { time: 600, value: -5, curve: spring }, { time: 700, value: 0 } ], opacity: [ { time: 600, value: 0 }, { time: 1000, value: 1, curve: easeInOut } ] } }拆解0–300msscale0→1 easeOut 放大rotate-180→0 easeOut 旋转。300–700mstranslateY0→-10→0→-5→0 spring 上下振荡。600–1000msopacity0→1 easeInOut 淡入。关键经验多属性协同 多段串联都在资源内定义——开发者只播资源不用 onFinish 串联多次 animateTo。4.2 开发者只管播aboutToAppear() { this.logoPlayer AnimationPlayer.create({ resource: resources/raw/logo_animation.json }); } Builder MainMenuView() { Column() { Image(resources/raw/logo.png) .width(200).height(200) .onComplete(() { // 图片加载完播放预定义动画 this.logoPlayer.play({ onFinish: () { console.info(开场动画播完显示主菜单按钮); this.showMenuButtons true; // 播完才显示按钮 } }); }) /* ... */ } }五、Lottie 矢量动画5.1 Lottie vs 位图动画维度位图动画帧序列 PNGLottie 矢量动画资源多张 PNG单个 JSON尺寸大每帧全图小只存路径缩放放大模糊矢量无限缩放清晰改色难重导出易改 JSON 颜色来源序列帧工具AE Bodymovin5.2 Lottie 加载import { Lottie } from kit.ArkUI; private fireLottie: Lottie | null null; aboutToAppear() { // 连击火焰特效 Lottie this.fireLottie Lottie.create({ resource: resources/raw/fire_combo.json, container: this.fireImageRef, loops: -1 // 无限循环 }); } // 连击 ≥ 3 触发火焰 Lottie handleComboFlash() { this.fireLottie?.play(); } // 连击结束停火焰 handleComboEnd() { this.fireLottie?.pause(); }5.3 Lottie 的优势// 矢量缩放清晰 Image().width(50).width(500) // 放大到 500 也不模糊 // 改色易改 JSON 里的 fill // fill: #FF6B6B → #3498DB重播即变蓝关键经验复杂矢量特效用 Lottie——火焰、爆炸、粒子等设计师用 AE 做的矢量动画导出 Lottie JSON 播放。六、实战开场 Logo 连击火焰6.1 准备资源假设设计师导出entry/src/main/resources/raw/logo_animation.json开场 Logo 多属性动画。entry/src/main/resources/raw/fire_combo.json连击火焰 Lottie。entry/src/main/resources/raw/logo.pngLogo 静态图。6.2 改造 Index// 来源entry/src/main/ets/pages/Index.etsHero Style Player 改造后 import { AnimationPlayer, AnimationOptions, Lottie, PlayMode } from kit.ArkUI; import { curves, Curve, animateTo, cancelAnimation } from kit.ArkUI; Entry Component struct Index { State gameState: GameState GameState.IDLE; State score: number 0; State cats: Cat[] []; State combo: ComboInfo { count: 0, multiplier: 1, lastMergeTime: 0 }; State nextCatLevel: CatLevel CatLevel.SMALL; State highScore: number 0; State gameTime: number 0; State showMenuButtons: boolean false; // 开场动画播完才显示 State comboFlashing: boolean false; // 连击火焰是否在播 private gameEngine: GameEngine new GameEngine(); private gameLoopTimer: number -1; private spawnTimer: number -1; private timeTimer: number -1; private readonly cols: number[] [0, 1, 2, 3, 4]; // Hero Style Player预定义动画本篇重点 private logoPlayer: AnimationPlayer | null null; private fireLottie: Lottie | null null; aboutToAppear() { // 加载开场 Logo 预定义动画 this.logoPlayer AnimationPlayer.create({ resource: resources/raw/logo_animation.json }); // 加载连击火焰 Lottie this.fireLottie Lottie.create({ resource: resources/raw/fire_combo.json, loops: -1 // 无限循环 }); } startGame() { this.clearTimers(); this.gameEngine.reset(); this.gameState GameState.PLAYING; this.score 0; this.cats []; this.gameTime 0; this.combo { count: 0, multiplier: 1, lastMergeTime: 0 }; this.nextCatLevel this.gameEngine.getNextCatLevel(); this.gameLoopTimer setInterval(() { if (this.gameState ! GameState.PLAYING) return; const oldComboCount this.combo.count; this.cats this.gameEngine.updateCats(); this.score this.gameEngine.getScore(); this.combo this.gameEngine.getCombo(); // 连击开始0 → ≥3触发火焰 Lottie本篇重点 if (oldComboCount 3 this.combo.count 3) { this.handleComboStart(); } // 连击结束≥3 → 0停火焰 if (oldComboCount 3 this.combo.count 0) { this.handleComboEnd(); } if (this.gameEngine.isGameOver()) { this.endGame(); } }, 100); /* spawnTimer、timeTimer 等略 */ } // 连击开始播火焰 Lottie handleComboStart() { this.comboFlashing true; this.fireLottie?.play(); } // 连击结束停火焰 handleComboEnd() { this.comboFlashing false; this.fireLottie?.pause(); } endGame() { this.gameState GameState.GAME_OVER; // 停所有预定义动画 this.logoPlayer?.cancel(); this.fireLottie?.pause(); this.comboFlashing false; /* ... 其他结束逻辑 ... */ this.clearTimers(); } aboutToDisappear() { // 组件销毁释放预定义动画资源 this.logoPlayer?.release(); this.fireLottie?.release(); this.clearTimers(); } /* pauseGame / resumeGame / handleColumnClick / clearTimers / formatTime 等略 */ Builder MainMenuView() { Column() { Spacer() // 开场 Logo播预定义动画本篇重点 Image(resources/raw/logo.png) .width(200).height(200) .onComplete(() { // 图片加载完播放预定义动画 this.logoPlayer?.play({ iterations: 1, playMode: PlayMode.Normal, onFinish: () { console.info(开场动画播完); this.showMenuButtons true; // 播完才显示按钮 } }); }) .margin({ bottom: 40 }) Text(猫猫大作战) .fontSize(28).fontWeight(FontWeight.Bold).fontColor(#2C3E50) .margin({ bottom: 8 }) Text(合并同类挑战最高分) .fontSize(14).fontColor(#7F8C8D) .margin({ bottom: 40 }) // 播完动画才显示按钮 if (this.showMenuButtons) { Button(开始游戏) .width(200).height(56) .fontSize(18).fontWeight(FontWeight.Bold) .fontColor(#FFFFFF).backgroundColor(#2ECC71) .borderRadius(28).margin({ bottom: 16 }) .onClick(() { this.startGame(); }) Button(查看历史) .width(200).height(44) .fontSize(16).fontColor(#3498DB).backgroundColor(transparent) .border({ width: 1, color: #3498DB }).borderRadius(22) .onClick(() { /* 跳战绩页 */ }) } Spacer() } .width(100%).height(100%) .linearGradient({ direction: GradientDirection.Bottom, colors: [[#E8F4F8, 0.0], [#D6EEF5, 0.5], [#C9E8F2, 1.0]] }) .alignItems(HorizontalAlign.Center) .justifyContent(FlexAlign.Center) // 主菜单转场 .transition( { type: TransitionType.All, opacity: 0, translate: { x: -300 } }, { duration: 300, curve: Curve.EaseInOut } ) } Builder GameHUD() { Row() { Column() { Text(得分).fontSize(11).fontColor(#95A5A6) Text(this.score.toString()) .fontSize(22).fontWeight(FontWeight.Bold).fontColor(#2C3E50) }.alignItems(HorizontalAlign.Start) Spacer() // 连击栏叠火焰 Lottie本篇重点 if (this.combo.count 1) { Stack() { // 火焰 Lottie 层连击 ≥ 3 时播 if (this.comboFlashing) { Image() .width(80).height(80) .bindLottie(this.fireLottie) // 绑 Lottie 播放 } // 连击文字层 Text( x${this.combo.multiplier}) .fontSize(18).fontWeight(FontWeight.Bold).fontColor(#FFFFFF) } .width(80).height(80) .justifyContent(FlexAlign.Center).alignItems(VerticalAlign.Center) } Spacer() Column() { Text(时间).fontSize(11).fontColor(#95A5A6) Text(this.formatTime(this.gameTime)) .fontSize(18).fontWeight(FontWeight.Medium).fontColor(#2C3E50) }.alignItems(HorizontalAlign.End) } .width(100%).padding({ left: 20, right: 20, top: 12, bottom: 8 }) } Builder GameView() { Column() { this.GameHUD() Column() { Row() { /* 预告区 */ } Stack() { /* 棋盘背景 */ ForEach(this.cats, (cat: Cat) { /* ... 猫咪渲染 ... */ }, (cat: Cat) cat.id) Row() { ForEach(this.cols, (col: number) { Column() .width(GameConfig.CELL_SIZE) .height(GameConfig.BOARD_HEIGHT * GameConfig.CELL_SIZE) .backgroundColor(rgba(0,0,0,0)) .onClick(() { this.handleColumnClick(col); }) }, (col: number) click_${col}) } } .width(GameConfig.BOARD_WIDTH * GameConfig.CELL_SIZE) .height(GameConfig.BOARD_HEIGHT * GameConfig.CELL_SIZE) .borderRadius(12).clip(true).backgroundColor(#D6EEF5) }.alignItems(HorizontalAlign.Center) Spacer() Row() { /* 底部控制栏 */ } .width(100%).padding({ left: 24, right: 24, bottom: 24, top: 12 }) } .width(100%).height(100%) .linearGradient({ direction: GradientDirection.Bottom, colors: [[#E8F4F8, 0.0], [#D6EEF5, 0.5], [#C9E8F2, 1.0]] }) .alignItems(HorizontalAlign.Center) .transition( { type: TransitionType.All, opacity: 0, translate: { x: 300 } }, { duration: 300, curve: Curve.EaseInOut } ) } build() { Stack() { if (this.gameState GameState.IDLE) { this.MainMenuView() } else { this.GameView() } if (this.gameState GameState.PAUSED) { this.PauseOverlay() } if (this.gameState GameState.GAME_OVER) { this.GameOverOverlay() } } .width(100%).height(100%) } /* PauseOverlay / GameOverOverlay / StatItem 等略 */ }6.3 触发流程开场 Logo 动画应用启动aboutToAppear加载logo_animation.json创建 Player。MainMenuView 渲染Image加载logo.png。onComplete触发logoPlayer.play()。播放 0–300msLogo scale 0→1 easeOut 放大rotate -180→0 easeOut 旋转。播放 300–700msLogo translateY 上下振荡 spring。播放 600–1000ms副标题 opacity 0→1 easeInOut 淡入。onFinish触发showMenuButtons true主菜单按钮淡入显示。连击火焰 Lottie玩家连击 ≥ 3handleComboStart触发fireLottie.play()。Lottie 无限循环播放火焰矢量动画loops: -1。连击栏 Stack 叠加 Lottie 层 文字层视觉上火焰在文字下燃烧。连击结束count → 0handleComboEnd调fireLottie.pause()火焰停。七、踩坑提示7.1 忘在 aboutToDisappear 释放// ❌ 错误没释放 Player/Lottie资源泄漏 aboutToDisappear() { this.clearTimers(); // 忘了 this.logoPlayer?.release(); // 忘了 this.fireLottie?.release(); } // ✅ 正确销毁时释放 aboutToDisappear() { this.logoPlayer?.release(); this.fireLottie?.release(); this.clearTimers(); }7.2 资源路径错误// ❌ 错误资源路径错Player 加载失败 AnimationPlayer.create({ resource: wrong/path.json }); // ✅ 正确路径用 raw 下的相对路径 AnimationPlayer.create({ resource: resources/raw/logo_animation.json });7.3 播放前未加载完// ❌ 错误aboutToAppear 异步加载未完立即 play 报错 aboutToAppear() { this.logoPlayer AnimationPlayer.create({ /* ... */ }); } build() { this.logoPlayer.play(); // 可能还没加载完 } // ✅ 正确在 onComplete 或 onFinish 回调里播 Image().onComplete(() { this.logoPlayer?.play(); });7.4 忘终断导致动画继续// ❌ 错误游戏结束没停 Lottie火焰还在播 endGame() { this.gameState GameState.GAME_OVER; // 忘了 this.fireLottie?.pause(); } // ✅ 正确结束停所有 endGame() { this.fireLottie?.pause(); this.logoPlayer?.cancel(); this.comboFlashing false; }7.5 用普通函数丢 this// ❌ 错误回调普通函数 this 丢失 this.logoPlayer.play({ onFinish: function () { this.showMenuButtons true; } }); // ✅ 正确箭头函数保留 this第 38 篇讲过 this.logoPlayer.play({ onFinish: () { this.showMenuButtons true; } });八、调试技巧console.info在 onFinish追动画播完时机验证流程。console.info在 aboutToAppear追 Player/Lottie 创建成功。不播放排查检查资源路径检查是否在加载完前调 play检查 Player 是否 null。DevEco Animation Inspector查看预定义动画播放过程和关键帧。九、性能与最佳实践「设计师做的复杂特效」用预定义 Player/Lottie——开场 Logo、火焰特效等。「数据驱动补间」用 animateTo——得分弹跳、合并放大等。aboutToAppear 加载aboutToDisappear 释放——避免资源泄漏。在 onComplete/onFinish 回调里播——确保资源加载完再播。Lottie 适合矢量特效——火焰、爆炸、粒子缩放清晰改色易。结束停所有预定义动画——cancel Player、pause Lottie避免结束后继续播。回调用箭头函数保留 this——普通函数 this 丢失。十、阶段三进度与收尾51–60本篇是阶段三「交互与动画」第 10 篇阶段三收尾篇主题核心要点51onTouch手势三阶段 Down/Move/Up52onHover悬停反馈TV/PC 场景53onKeyEvent键盘/遥控按键54bindContextMenu上下文菜单55animateTo显式动画触发56animation隐式补间57Hero共享元素跨页面58transitionif 进/出转场59Spring弹簧物理振荡60本篇Hero Style Player播放预定义动画/Lottie阶段三核心收获事件四件套onTouch 手势、onHover 悬停、onKeyEvent 按键、bindContextMenu 菜单——覆盖触摸/鼠标/遥控/键盘四类输入。动画四件套animateTo 显式触发、animation 隐式补间、Hero 跨页面单元素、transition 整页面进/出——各管一场景。物理与预定义Spring 弹簧振荡、Hero Style Player/Lottie 播放设计师做的复杂特效。五种动画 API 取舍循环改 animation点击 animateToif 进出 transition跨页面 Hero设计师做 Player/Lottie。接下来阶段四61–80将进入网络与数据HTTP 请求、REST/GraphQL、数据序列化、SQLite 持久化、Preference 键值存储、文件 IO、数据绑定、列表分页、下拉刷新、上拉加载、离线缓存等。总结本篇我们从 Hero Style Player 预定义动画切入掌握了预定义 vs 运行时差异设计师做 vs 代码补间、AnimationPlayer 播放控制play/pause/cancel/seekTo、多段关键帧序列资源内定义多属性协同、**Lottie 矢量动画缩放清晰改色易**四大要点并给出了开场 Logo 连击火焰的完整改造代码。核心要点设计师做用 Player/Lottie数据驱动用 animateToaboutToAppear 加载 aboutToDisappear 释放回调用箭头函数结束停所有。下一篇我们将进入阶段四拆解 HTTP 请求——网络请求实战。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源「猫猫大作战」项目源码本仓库entry/src/main/ets/pages/Index.etsArkUI AnimationPlayer 预定义动画官方指南Lottie 矢量动画官方指南HarmonyOS 动画资源与最佳实践开源鸿蒙跨平台社区HarmonyOS 开发者官方文档首页系列索引本仓库articles/INDEX.md

相关新闻

一文读懂FLUX 3核心基础知识:同时生成图像和视频,让一个模型学会模拟世界并驱动机器人

一文读懂FLUX 3核心基础知识:同时生成图像和视频,让一个模型学会模拟世界并驱动机器人

写在前面 欢迎大家关注Rocky的知乎:Rocky Ding 《三年面试五年模拟》AIGC/LLM/AI Agent算法工程师/开发工程师求职面试秘籍独家资源:【三年面试五年模拟】WeThinkIn/AIGC-Interview-Book,欢迎大家Star~ Rocky最新撰写的10万字AI A…

2026/7/28 0:08:30阅读更多 →
淘天二面被问:RAG怎么做Bad Case分析,面试者说:统计指标,比如准确率、召回率,通过这些指标发现问题。面试官笑了一下,没接话...

淘天二面被问:RAG怎么做Bad Case分析,面试者说:统计指标,比如准确率、召回率,通过这些指标发现问题。面试官笑了一下,没接话...

我的一个本科的师弟,上周去面了阿里做大模型应用的,是二面。聊了大概半小时吧,聊了RAG架构,聊了chunk策略,还聊了向量数据库的选型。他自己感觉聊得还挺顺的。然后呢,面试官突然就抛出了一个问题&#xff1…

2026/7/28 0:08:30阅读更多 →
从知识图谱到认知拓扑:知识工程方式的范式跃迁

从知识图谱到认知拓扑:知识工程方式的范式跃迁

摘要 本文探讨了从“知识图谱”到“认知拓扑”的范式跃迁。这一跃迁的必然性,隐含在两者的命名之中 知识是名词,代表已完成的状态;认知是动词,代表持续演化的过程。图谱是二维的平面结构,拓扑是高维的连通空间。 本…

2026/7/28 0:08:30阅读更多 →
AS| (二)Android Studio快捷键【JetBrains家族】

AS| (二)Android Studio快捷键【JetBrains家族】

目录 一、JetBrains IDE (一)什么是IDE? (二)JetBrains家族 ​编辑 二、Android Studio快捷键 (一)快捷键方案 (二)快捷键修改 (三)快捷键…

2026/7/28 10:57:08阅读更多 →
windows环境下基于3DSlicer 源代码编译搭建工程开发环境详细操作过程和中间关键错误解决方法说明

windows环境下基于3DSlicer 源代码编译搭建工程开发环境详细操作过程和中间关键错误解决方法说明

说明: 该文档适用于  首次/重新 搭建3D-Slicer工程环境  Clean up(非增量) 编译生成 1. 3D-slicer 软件介绍 (1)3D Slicer为处理MRI\CT等图像数据软件,可以实行基于MRI图像数据的目标分割、标记测量、坐…

2026/7/28 10:57:08阅读更多 →
MATLAB实现时间序列预测:LS-SVM与改进PSO优化

MATLAB实现时间序列预测:LS-SVM与改进PSO优化

1. 项目概述:时间序列预测的MATLAB实现方案时间序列预测是数据分析领域的核心课题,在金融、气象、工业控制等领域具有广泛应用价值。这个项目聚焦三种基于支持向量机的预测方法:传统最小二乘支持向量机(LS-SVM)、结合粒…

2026/7/28 10:57:08阅读更多 →
rsyslog日志管理:核心配置与高并发实践

rsyslog日志管理:核心配置与高并发实践

1. rsyslog基础认知与核心价值在分布式系统和微服务架构盛行的当下,日志管理已成为运维工作的关键环节。rsyslog作为Linux系统默认的日志处理工具,其重要性常被低估。实际上,它不仅能处理本地日志,更是一个强大的日志转发中枢——…

2026/7/28 10:57:08阅读更多 →
AI Agent 如何通过全网感知与 IDE 深度集成重塑开发工作流

AI Agent 如何通过全网感知与 IDE 深度集成重塑开发工作流

昨天下午,我在调试一个复杂的多模块项目时,遇到了一个典型的“信息孤岛”问题:我需要参考一个开源库的文档,但它的 README 写得语焉不详;我想看看社区里有没有人遇到过类似问题,得去论坛和博客翻找&#xf…

2026/7/28 10:57:08阅读更多 →
从代码生成到工作流引擎:Codex 2026 实战入门指南

从代码生成到工作流引擎:Codex 2026 实战入门指南

如果你以为 Codex 只是一个“能写代码的 AI”,或者一个“高级版的代码补全工具”,那可能就错过了它真正的价值。很多开发者第一次接触 Codex 时,都抱着“试试看它能写多少行代码”的心态,结果往往在配置环境、理解概念和实际应用场景上就卡住了,最终得出“不过如此”的结论…

2026/7/28 10:55:08阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →