1. 为什么你需要一个圆环进度条?
在开发移动应用或者小程序的时候,我们经常会遇到需要展示进度、完成度或者评分的场景。比如,健身App里展示今天的运动目标完成情况,学习软件里展示课程的学习进度,或者一个工具类App里展示文件的上传下载进度。这时候,一个简单的数字百分比(比如“75%”)就显得有点干巴巴的,不够直观,也缺乏视觉冲击力。
而一个动态的、带有色彩的圆环进度条,就能完美解决这个问题。它把抽象的数字转化成了可视化的图形,用户一眼就能感受到“还差多少”、“完成了多少”,体验感直接拉满。在UniApp这个跨端框架里,官方提供的<progress>组件是条状的,虽然能用,但样式比较单一,很难做出那种精致的、圆环形的进度效果。
所以,自己动手封装一个圆环进度条组件,就成了很多UniApp开发者的刚需。这不仅仅是为了好看,更是为了提升产品的交互细节和用户体验。你可能在网上搜到过一些用canvas画圆的例子,但直接拿来用往往会遇到一堆问题:在不同尺寸的手机上显示大小不一、滚动页面时动画卡顿、或者想改个颜色、加个渐变都无从下手。
别担心,接下来我就把自己在实际项目中反复打磨、踩过无数坑才总结出来的实现方法和优化技巧,毫无保留地分享给你。从最基础的画圆开始,到如何让它自适应各种屏幕,再到怎么优化性能让它丝滑流畅,最后还会教你如何把它变成一个高度灵活、可复用的“瑞士军刀”式组件。无论你是UniApp新手,还是有一定经验想优化现有组件的开发者,这篇文章都能给你带来实实在在的帮助。
2. 从零开始:手把手实现基础圆环
万事开头难,我们先从最核心的部分入手:怎么在canvas上画出一个圆环进度条。别看最终效果好像挺复杂,拆解开来,其实就是画三个圆形。
首先,我们需要在Vue单文件组件里,创建一个canvas画布。canvas-id必须是唯一的,所以我们通常用props传进来的id来动态生成。
<template>
<canvas :canvas-id="'progress'+id" :style="{width: sizeNum + 'px', height: sizeNum + 'px'}"></canvas>
<slot></slot>
</template>
注意看,这里我留了一个<slot>插槽。这个设计非常关键,它允许我们在圆环中间自由地插入任何内容,比如百分比数字、图标或者描述文字,这让组件的用途大大拓宽了,不仅仅是显示进度。
接下来,我们定义组件需要接收哪些参数,也就是props。这是组件灵活性的基础。
export default {
props: {
id: { type: String, required: true }, // 唯一标识,必传
progressColor: { type: String, default: '#409EFF' }, // 进度条颜色
bgColor: { type: String, default: '#F9FAFB' }, // 背景轨道颜色
size: { type: Number, default: 100 }, // 画布尺寸(设计稿尺寸)
strokeWidth: { type: Number, default: 20 }, // 圆环的粗细
percent: { type: Number, default: 0 } // 进度百分比,0-100
},
data() {
return {
sizeNum: this.size, // 最终渲染的实际像素尺寸
strokeWidthNum: this.strokeWidth // 最终渲染的实际圆环粗细
}
},
mounted() {
this.drawProgress(); // 组件挂载后立即绘制
},
watch: {
percent() {
this.drawProgress(); // 百分比变化时,重绘进度
}
}
}
参数定义好了,重头戏就在drawProgress这个方法里。我来详细拆解一下绘制步骤,理解了原理,后面优化起来就得心应手了。
第一步,获取绘图上


7360

被折叠的 条评论
为什么被折叠?



