《HarmonyOS技术精讲-ArkGraphics 2D(方舟2D图形服务)》第七篇:动效来袭——与ArkUI结合实现2D动画与交互
📅 2026/7/8 4:00:54
👁️ 次浏览
HarmonyOS技术精讲-ArkGraphics 2D方舟2D图形服务第七篇动效来袭——与ArkUI结合实现2D动画与交互Canvas动画加上交互难在哪ArkUI 里做 Canvas 动画大多数人第一次写都会遇到两个问题状态同步和触摸坐标转换。状态同步指的是动画循环里的变量比如旋转角度如何驱动 Canvas 重新绘制同时又不让整个组件频繁重建。触摸坐标转换则是手指在屏幕上滑动时如何准确映射到 Canvas 的绘制坐标系。这两个问题单独看都不复杂但放在一起处理时生命周期管理、动画启停、交互响应这些细节很容易出 bug。官方示例通常只展示静态绘制或者简单动画一旦掺入用户交互代码就需要额外处理不少边界情况。这篇文章用一个可拖拽旋转的风车作为案例把状态管理、动画循环、触摸交互这三块内容串起来讲。风车叶片持续旋转用户拖拽时改变旋转方向和速度松手后带惯性减速。这个场景刚好覆盖了 ArkGraphics 2D 与 ArkUI 交互的核心技术点。它解决什么问题这个案例的目标是在 ArkUI 中实现一个连续动画的 2D 图形并且用户可以通过触摸直接控制动画状态。适用场景包括需要用户手势操控的图形化控件如旋钮、转盘带有惯性效果的 UI 组件如滑动选择器游戏中的拖拽旋转元素不适用场景纯静态图形展示不需要动画循环复杂 3D 场景应使用 WebGL 或专用引擎与直接用 ArkUI 的动画属性如animation相比Canvas 方式有几个明显差异特性Canvas requestAnimationFrameArkUI animation 属性绘制自由度任意 2D 图形无组件限制仅支持组件级属性动画交互控制可精细控制每帧状态通过交互事件触发动画性能开销逐帧绘制GPU 友好组件属性变化触发重绘惯性/物理模拟容易实现需要额外计算这个案例选择 Canvas 方案主要是因为风车的叶片形状扇形在 ArkUI 原生组件中无法直接实现而 Canvas 可以自由绘制。同时拖拽旋转和惯性效果需要逐帧控制角度这正是requestAnimationFrame擅长的领域。环境说明DevEco Studio 版本DevEco Studio 6.1.0 及以上 HarmonyOS SDK 版本HarmonyOS 6.1.0(23) 及以上 目标设备手机核心实现整个功能分解为四个部分状态管理、Canvas 绘制、动画循环、触摸交互。下面逐个实现。状态管理风车的核心状态是旋转角度和角速度。角度决定当前绘制位置角速度控制惯性旋转。// 风车状态StatecurrentAngle:number0;// 当前旋转角度弧度privateangularVelocity:number0;// 当前角速度弧度/帧privateisDragging:booleanfalse;// 是否正在拖拽State装饰器让currentAngle的变化自动触发 UI 刷新。angularVelocity和isDragging不需要驱动 UI所以用private标记避免不必要的状态追踪。这里有个设计取舍为什么不把angularVelocity也设为State因为角速度只在动画循环中使用不直接影响 Canvas 绘制内容。如果把它也设为响应式状态每次修改都会触发组件更新检查反而增加开销。Canvas 绘制风车风车由 4 个扇形叶片和一个中心圆组成。每个叶片使用arc绘制扇形填充不同颜色。// 绘制风车privatedrawWindmill(ctx:CanvasRenderingContext2D,width:number,height:number):void{constcxwidth/2;constcyheight/2;constbladeLength80;// 叶片长度constbladeAngleMath.PI/3;// 叶片张开角度 60°constcolors[#FF6B6B,#4ECDC4,#45B7D1,#FFE66D];// 清空画布ctx.clearRect(0,0,width,height);// 绘制背景辅助圆淡灰色ctx.beginPath();ctx.arc(cx,cy,bladeLength10,0,Math.PI*2);ctx.strokeStyle#E0E0E0;ctx.lineWidth1;ctx.stroke();// 绘制 4 个叶片for(leti0;i4;i){conststartAnglethis.currentAnglei*Math.PI/2-bladeAngle/2;constendAnglethis.currentAnglei*Math.PI/2bladeAngle/2;ctx.beginPath();ctx.moveTo(cx,cy);ctx.arc(cx,cy,bladeLength,startAngle,endAngle);ctx.closePath();ctx.fillStylecolors[i];ctx.fill();// 叶片边缘描边ctx.strokeStyle#333;ctx.lineWidth1.5;ctx.stroke();}// 绘制中心圆ctx.beginPath();ctx.arc(cx,cy,14,0,Math.PI*2);ctx.fillStyle#2C3E50;ctx.fill();ctx.strokeStyle#1A252F;ctx.lineWidth2;ctx.stroke();// 中心小圆点ctx.beginPath();ctx.arc(cx,cy,4,0,Math.PI*2);ctx.fillStyle#FFFFFF;ctx.fill();}这里需要注意叶片的角度范围是currentAngle加上每个叶片的偏移量i * π/2再加减半个叶片张角。这样 4 个叶片正好均匀分布整体旋转由currentAngle控制。中心圆加两层是为了视觉层次感小圆点作为装饰也让触摸拖拽时有个视觉焦点。动画循环动画循环使用requestAnimationFrame驱动每帧更新角度并重绘。privateanimatorId:number-1;privatestartAnimation(ctx:CanvasRenderingContext2D,width:number,height:number):void{constanimate(){if(!this.isDraggingMath.abs(this.angularVelocity)0.001){// 惯性旋转角度累加速度衰减this.currentAnglethis.angularVelocity;this.angularVelocity*0.985;// 阻尼系数}this.drawWindmill(ctx,width,height);this.animatorIdrequestAnimationFrame(animate);};animate();}privatestopAnimation():void{if(this.animatorId!-1){cancelAnimationFrame(this.animatorId);this.animatorId-1;}}惯性效果的核心逻辑松手后angularVelocity逐渐衰减到零每次衰减乘以 0.985。这个系数决定了惯性持续的时间0.98 到 0.99 之间手感比较自然可以根据需要调整。示例代码地址项目地址
古人养生核心逻辑:顺应天地自然,调和气血阴阳,以内养外,不依赖药物,分为顺时起居、饮食调摄、引导运动、情志养心、经络调养、药食缓补六大体系。一、顺天时起居:跟着日月四季过日子《黄帝内经》是养生总纲…
📅 2026/7/8 4:00:54
昨天刷到一条推文,评论区吵到停不下来。
AI提示词博主Alex Prompter甩出一句话:
"Anthropic研究了23.5万名使用Claude Code的人。懂自己领域的人,表现比会写代码的人更好。"
8小时,8.8万查看,662个赞。评…
📅 2026/7/8 4:00:54
Over one million businesses around the world are leveraging AI to drive greater efficiency and value creation. But some organizations have struggled to get the results they are expecting. What is causing the gap?
At OpenAI we are leveraging AI internal…
📅 2026/7/8 3:58:54
测评主体公示本次测评将对以下几家在数字福利行业具有代表性的企业进行对比分析:江苏瑞祥科技集团有限公司(简称“瑞祥”)、中智关爱通、京东企业购。我们将从技术创新力、市场占有率、用户口碑和服务体系四个维度,按照统一标准进…
📅 2026/7/8 5:03:06
在口腔美学的前沿文献与国际牙科展会上,一项新型牙齿美白技术名称出现的频率越来越高:Plasma Teeth Whitening。对于习惯了“冷光美白”“皓齿美白”等中文商业名称的国内从业者与消费者而言,这个直译过来略显生硬的词汇,往往让人…
📅 2026/7/8 5:03:06
当前,全球市场竞争进入深度博弈的新阶段,海外GEO(生成式引擎优化)投放已彻底完成角色迭代:从企业出海的锦上添花,变成品牌全球化拓客、长效增量的核心刚需。进入2026年,AI智能营销深度落地、跨渠道全域整合、合规精细化…
📅 2026/7/8 5:03:06
OpenCV 4.8 图像去阴影实战:LAB空间3步法实现85%文档阴影去除率 在文档扫描、OCR识别和图像归档等场景中,阴影干扰一直是影响识别精度的主要瓶颈之一。传统RGB空间的处理方法往往难以区分真实色彩变化与阴影区域,而基于LAB颜色空间的解决方案…
📅 2026/7/8 5:03:06
在制药行业,A/B 级洁净区的每一次人员进出,都伴随着严格的控制流程,也会增加污染控制与合规管理压力。当一条无菌产线同时存在多种品牌 PLC 时,如何在减少重复进出洁净区的前提下,高效完成数据采集与控制系统调试&…
📅 2026/7/8 5:03:06
Pixelle-Video完全指南:零基础制作专业AI短视频的终极教程 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video
Pixelle-Video是一…
📅 2026/7/8 5:01:06
Docker 彻底卸载指南:CentOS/Ubuntu 双系统 5 步清理残留文件当 Docker 环境出现版本冲突、安装失败或需要迁移时,常规的卸载命令往往无法彻底清理系统。残留的配置文件、依赖项和缓存文件可能导致新安装的 Docker 出现各种诡异问题。本文将提供一套完整…
📅 2026/7/8 0:00:10
SQL 数据分析性能优化实战:窗口函数 vs 子查询 vs 临时表 在数据分析工作中,SQL查询性能往往是决定工作效率的关键因素。面对复杂的业务场景,如何选择最优的查询方案?本文将深入对比窗口函数、子查询和临时表三种技术方案…
📅 2026/7/8 0:00:10
日期:2026-07-07> 本期聚焦近一日(2026-07-06 至 07-07)出台的金融与行业政策,按"背景—核心—影响—受益/风险"四维度解读。政策内容依据原始发布信息整理,解读仅供参考,不构成投资建议。一、…
📅 2026/7/8 0:00:10
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/7 12:08:23
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/7 9:08:28
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/7 6:33:36
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/7 9:08:31
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/7 9:08:30
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/7 4:32:18