uni-app怎么实现圆环进度条动画 uni-app环形图表实现教程【代码】

梦枫大大_9349

梦枫大大_9349

2026-03-24

637人浏览

原创

canvas是uni-app跨端绘制圆环进度条最稳定方案,需用id获取上下文、动态计算圆心、requestanimationframe驱动动画,并在onready后调用draw且小程序端加16ms延时确保重绘。

uni-app怎么实现圆环进度条动画 uni-app环形图表实现教程【代码】

uni-app 里用 canvas 绘制圆环进度条最稳

纯 CSS 实现的圆环在 uni-app 里容易错位、缩放失真,尤其在 iOS 微信 WebView 和小程序端表现不一致;canvas 是唯一能跨端精确控制弧长、起始角、动画帧的方案。别碰 SVG 或 CSS clip-path,它们在 H5 和小程序渲染逻辑差异大,调试成本远高于直接写 canvas。

实操建议:

  • 用 uni.createCanvasContext 获取上下文,**必须传入 canvas 组件的 id 字符串**,不能传 ref 或 DOM 对象(小程序不支持)
  • 绘制前先调用 ctx.clearRect 清空画布,否则多端复用时旧帧残留
  • 圆心坐标按 canvas 宽高动态算:const cx = width / 2; const cy = height / 2;,别写死像素值
  • 动画用 requestAnimationFrame 驱动,**不要用 setInterval** —— 小程序里后者无法触发 canvas 重绘

progress 值变化时 canvas 不重绘?检查 draw 调用时机

常见错误是把 ctx.draw() 放在 setData 之后但没等下一次渲染周期,或在非主线程(如 onPullDownRefresh 回调里)直接调用,导致 canvas 内容卡在旧状态。

实操建议:

  • ctx.draw() 必须在 uni.createCanvasContext 创建后、且 canvas 元素已挂载到页面上再执行(可用 onReady 生命周期确保)
  • 进度更新时,先改 data 中的 percent,再在 $nextTick 里调用绘制逻辑(H5 有效),**小程序端要加一层 setTimeout(() => { ctx.draw() }, 16) 模拟帧同步**
  • 避免在 watch 里频繁调用 ctx.draw(),每次调用都触发全量重绘,卡顿明显;建议加节流,比如 if (Math.abs(newVal - oldVal)

小程序和 H5 圆环粗细不一致?重点看 lineWidth 和 devicePixelRatio

canvas 默认以物理像素绘制,但 uni-app 的 canvas 组件在不同平台对 width/height 属性解释不同:H5 是 CSS 像素,小程序是设备独立像素(rpx),导致同样 lineWidth: 8 在 iPhone 上看起来细,在安卓模拟器上看起来粗。

实操建议:

  • 统一用 uni.getSystemInfoSync().pixelRatio 动态计算线宽:ctx.lineWidth = 8 / pixelRatio
  • canvas 组件的 style="width: 200px; height: 200px;" 必须显式设置,且宽高等比(否则圆变椭圆),**不能只靠 class 或 flex 布局撑开**
  • 抗锯齿关闭更稳妥:ctx.setLineCap('round') + ctx.setLineJoin('round'),避免边缘毛刺

动画卡顿或跳变?别用百分比插值,改用角度缓动

直接对 percent 做线性插值(比如从 0→100 每帧加 2)在低帧率设备上会明显跳变,因为 canvas 弧长计算依赖 startAngle 和 endAngle,而角度本身是非线性的视觉感知。

实操建议:

  • 用缓动函数控制角度增量,例如 const eased = 1 - Math.pow(1 - t, 3)(三次缓动),再映射到 endAngle = startAngle + eased * 2 * Math.PI * 0.8
  • 起始角统一设为 -Math.PI / 2(12 点钟方向),避免不同平台默认方向差异
  • 动画结束时务必手动设回目标角度,别依赖最后一帧——requestAnimationFrame 可能被丢帧,导致进度条永远差 0.5%

最麻烦的其实是 canvas 在某些低端安卓机上首次绘制延迟明显,得在页面 onLoad 里提前创建 context 并 draw 一次空内容,不然用户滑动时才第一次画,会卡住。这事没人提,但真会发生。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2443

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5283

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6330

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5918

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

843

5

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

2023.10.23

4031

6

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

2026.05.19

244

21

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

2026.10.10

100

15

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

2026.10.10

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习