发布时间:2026/7/24 1:08:14
【OpenHarmony/HarmonyOS】ArkUI 科幻星空动效:Canvas 粒子、流星与声明式多层动画 【OpenHarmony/HarmonyOS】ArkUI 科幻星空动效Canvas 粒子、流星与声明式多层动画如何不依赖视频背景在 HarmonyOS 页面中实现具有空间感的动态星空本文拆解一个由 Canvas 星粒子、流星、渐变背景和 ArkUI 几何动画共同组成的可复用组件。一、把背景拆成不同频率的图层项目的GalaxyBackground不是一张静态图而由四层组成静态深色渐变底缓慢旋转的模糊星云Canvas 绘制的 100 颗星与随机流星ArkUI Circle、Polygon、Rect 组成的旋转能量阵。这种分层让不同内容使用最合适的工具大量小粒子交给 Canvas规则几何和声明式动画交给 ArkUI。二、星星的数据结构interfaceStar { x:number; y:number;size:number; speed:number; alpha:number; twinkleSpeed:number; }初始化时为每颗星随机位置、大小、速度和闪烁相位for(leti 0; i 100; i) {this.stars.push({x:Math.random() *360,y:Math.random() *800,size:Math.random() *20.5,speed:Math.random() *0.50.1,alpha:Math.random(),twinkleSpeed:Math.random() *0.050.01}); }逻辑使用 360×800 的参考坐标绘制时根据 Canvas 实际宽高缩放。因此同一组星星可以覆盖不同屏幕。三、60 FPS 更新星星和亮度this.renderInterval setInterval(() {this.nebulaRotation 0.1;this.stars.forEach(star { star.y star.speed; star.alpha star.twinkleSpeed;if(star.alpha 1|| star.alpha 0.2) { star.twinkleSpeed -star.twinkleSpeed; }if(star.y 800) { star.y -10; star.x Math.random() *360; } });this.updateShootingStar();this.drawGalaxy(); },16);亮度到达上下边界时反转变化方向形成闪烁。星星超出底部后回到顶部并随机 X 坐标形成持续流动。严格来说这段运动没有乘deltaTime因此定时器延迟会让速度变慢。可复用组件最好记录真实帧间隔让动画在不同负载下保持一致。四、随机生成流星 ☄️每次更新有约 1% 概率创建一颗流星if(!this.shootingStarMath.random() 0.01) {this.shootingStar {x:Math.random() *360,y: -50,length:Math.random() *5050,speed:Math.random() *1510,angle:Math.PI/4}; }绘制时用线性渐变从不透明白到透明const gradient ctx.createLinearGradient( startX, startY,endX,endY ); gradient.addColorStop(0, rgba(255,255,255,1)); gradient.addColorStop(1, rgba(255,255,255,0)); ctx.beginPath(); ctx.strokeStyle gradient; ctx.moveTo(startX, startY); ctx.lineTo(endX,endY); ctx.stroke();一条带透明尾迹的线就能产生流星感不需要图片序列。五、Canvas 适配实际尺寸constwidth ctx.width;constheight ctx.height;constscaleX width /360;constscaleY height /800; ctx.arc( star.x * scaleX, star.y * scaleY, star.size,0, Math.PI *2);当前大小没有随屏幕比例缩放位置会铺满画面而星点半径保持视觉像素稳定这通常比等比放大更自然。若参考坐标纵横比与横屏差异很大scaleX与scaleY不同会改变流星角度可改为统一缩放加居中裁切。六、声明式几何动画的优势外层能量阵使用多个 Circle 的虚线描边、两个 Polygon 组成六芒星、Rect 旋转构成核心。每层只需绑定角度状态Stack() {Circle({width:720,height:720}).fill(Color.Transparent).stroke(rgba(0,229,255,0.4)).strokeDashArray([40,10,10,10,80,20]); } .rotate({angle: this.magicRotationSlow }) .animation({duration:80000,iterations: -1,curve: Curve.Linear }) .onAppear(() { this.magicRotationSlow 360; });中层反向旋转内层更快旋转核心使用 Alternate 动画做呼吸缩放。速度、方向、透明度不同后几何元素自然产生纵深感。七、背景组件必须不拦截事件所有背景层都设置.hitTestBehavior(HitTestMode.None)否则全屏 Canvas 或 Stack 会挡住登录按钮、商城列表和战斗 HUD。视觉背景没有交互语义应彻底退出命中测试。八、生命周期清理不能遗漏组件出现时启动循环消失时清除aboutToDisappear(): void {if(this.renderInterval ! -1) { clearInterval(this.renderInterval);this.renderInterval -1; } }如果页面路由离开后仍保留定时器后台会继续更新星星和调用 Canvas既耗电又可能引用失效上下文。所有动画源都应有对称的停止逻辑。九、复用组件时要警惕多实例成本启动页、主页、设置、商城和排行榜都可能使用同一个背景组件。路由栈如果同时保留多个页面可能存在多个 60 FPS 定时器。优化方向包括页面不可见时暂停静态页面将星空降到 30 FPS共享统一帧调度器根据画质设置减少星数和模糊reduceMotion偏好开启时只保留静态背景避免多个大半径blur同时持续动画。十、不要在 Canvas 热循环里驱动大量 Statestars被声明为State但内部对象属性在定时器中原地变化真正绘制由 Canvas 手动完成。既然不依赖 ArkUI 重建星星节点可将高频粒子数据作为普通私有字段只把必要的声明式角度保留为状态减少状态观察开销和语义混淆。十一、如何让背景更适合产品而不是 Demo 降低星云模糊和中心图案对文字的干扰不在所有页面使用同样强度设置页应更安静根据页面焦点改变局部亮度而不是堆叠更多装饰统一颜色 Token避免每个组件复制十六进制值为低性能模式关闭阴影和大模糊对小屏检查 800px 圆环是否裁切得自然让背景只负责氛围不与主操作争夺对比度。十二、总结 ✨这个星空组件展示了一种实用组合Canvas 处理数量多、形状简单的星粒子和流星ArkUI 处理规则几何与长周期声明式动画参考坐标适配不同屏幕图层使用不同速度和方向建立纵深背景退出命中测试生命周期结束时清理定时器画质、页面可见性和多实例数量共同决定性能。真正成熟的动效不是元素越多越好而是在不影响阅读、交互和功耗的前提下让页面具有稳定而有辨识度的氛围。推荐标签HarmonyOSOpenHarmonyArkUI动画Canvas粒子效果ArkTS

相关新闻

2026/7/24 1:08:14

doom3 代码结构

doom3代码结构 code 原文地址 https://www.iddevnet.com/doom3/code.php , 原来 我认为这个网站已经倒闭了,毕竟从Doom4,quake4是2004,2005的, 关注的人太少了 ,我觉得这些文章有助于对于doom3,代码的理解&#xff…

2026/7/24 1:08:14

Java DDD(领域驱动设计)

一句话核心: DDD(领域驱动设计)不是一套框架,而是一种代码组织哲学。它要求你用代码直接翻译业务语言,而不是把业务逻辑散落在增删改查(CRUD)里。 对于Java开发者,最经典的DDD范式就…

2026/7/24 1:08:14

MSPM0微控制器NONMAIN配置详解:从安全启动到量产避坑指南

1. 项目概述:为什么你需要关注MSPM0的NONMAIN配置?如果你正在使用德州仪器(TI)的MSPM0 L系列微控制器,并且你的产品即将进入量产阶段,或者你正在设计一个对安全性、可靠性和知识产权保护有要求的嵌入式系统…

2026/7/24 2:43:19

自动化发现系统约束框架设计:从原理到工程实践

这次我们来看一个关于自动化发现与约束框架的核心观点:没有一种通用的最优约束方案。这个主题探讨的是在人工智能和自动化系统中,如何设计有效的约束机制来引导发现过程,但不存在适用于所有场景的万能解决方案。从技术实践角度看,…

2026/7/24 2:43:19

Aeon.WorX通用对象生命周期管理:从状态机原理到Spring Boot实践

在制造业、软件开发和系统工程领域,管理一个对象从概念、设计、制造、运维到报废的全过程,一直是项目复杂度和数据一致性的挑战点。传统上,产品生命周期管理(PLM)和产品数据管理(PDM)系统试图解…

2026/7/24 2:43:19

多模态大模型实战16

第16章 多模态模型微调实战——LoRA/QLoRA/P-Tuning 学习目标 理解全参数微调 vs LoRA vs QLoRA vs P-Tuning的区别 掌握LoRA原理和参数配置 实战QLoRA微调VLM 用LLaMA-Factory微调LLaVA 16.1 微调策略对比 策略 可训练参数 显存 效果 适用场景 全参数微调 100% 最高 最好 数据…

2026/7/24 2:43:19

多模态大模型实战15

第15章 多模态安全与对齐——幻觉检测与红队测试 学习目标 理解VLM幻觉问题的类型和产生原因 掌握幻觉检测方法 了解多模态对齐技术(DPO/RLHF) 认识红队测试和安全评估 掌握防御策略 15.1 VLM幻觉问题 什么是VLM幻觉 VLM幻觉是指模型生成与图片内容不符的回答,包括"…

2026/7/24 2:43:19

Flash技术深度解析:从嵌入式存储到模型推理优化的完整指南

在深度学习模型推理和部署过程中,Flash 技术已经成为提升计算效率、降低延迟的关键手段。无论是处理大规模语言模型还是优化嵌入式设备的存储性能,理解 Flash 的工作原理和实际应用都至关重要。本文将以 Gemini 3.6 Flash 的改进为切入点,深入…

2026/7/24 2:38:18

学生党请注意!2026最新3款高口碑实用英语词汇学习软件推荐

核心要点: 1. 本次推荐全部基于2026年1-6月公立校实测使用数据,无任何商业合作;2. 重点拆解AI驱动类词汇工具的核心技术差异,避免盲目跟风选品;3. 针对不同学习场景给出适配建议,主打低时间成本提效。先聊聊…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/24 0:03:10

不同品牌斜齿行星减速机如何替换?以PX与PAG系列为例

不同品牌斜齿行星减速机如何替换?以 PX 与 PAG 系列为例 一、系列对应不等于型号直接互换 PX 与 PAG 都属于斜齿、方法兰、输出轴式精密行星减速机,结构形式和应用方向具有对应关系。 原设备使用PX系列时,可以优先从PAG系列中寻找替换型号。但…

2026/7/24 0:03:10

jdk8 把list 扁平化成String 多个以逗号分隔

在 JDK 8 中&#xff0c;将 List 扁平化为以逗号分隔的 String&#xff0c;有几种非常简洁且高效的方法。&#x1f680; 推荐方案&#xff1a;使用 Collectors.joining()这是最标准的 Java 8 写法&#xff0c;适用于 List<String>。javaimport java.util.stream.Collecto…

2026/7/24 0:03:10

java 两个 long id 怎么合并成一个long id 并且不重复

“把两个 Long ID 合并成一个唯一的 Long ID&#xff0c;且保证不重复”这个需求&#xff0c;在 Java 里直接做数学上的“完美合并”是不可能的。因为两个 Long&#xff08;各 64 位&#xff09;要合并成一个 Long&#xff08;64 位&#xff09;&#xff0c;在信息论上是有损压…

2026/7/23 23:42:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…