小程序 js+Canvas 绘制半圆环虚线进度条

2024-06-12 21:52

本文主要是介绍小程序 js+Canvas 绘制半圆环虚线进度条,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果图:

思路:过程分为三步,第1步,先画虚线底部背景,第2步,画动态的虚线(已选虚线蓝颜色),第3步,画动态的外标(已选虚线外位置的标),相关联的有1和2、2和3,1和2比较明显,颜色背景位置相同,2覆盖在1上,2和3终点位置相同,也就是计算弧度是一样的。

代码实现:
<view class="progress_item"><canvas class="progress_ring" type="2d" id="bgline"></canvas><canvas class="progress_draw" type="2d" id="drawLine"></canvas><canvas class="progress_move" type="2d" id="drawMove" bind:touchstart="moveDraw" bind:touchmove="moveDraw"></canvas>
</view>
css:
.progress_item{width:100%;position: relative;}
.progress_ring{width:280px;height: 140px;margin: 30px auto;}
.progress_draw{position: absolute;left:50%;transform: translateX(-50%);z-index: 3;top:0;width:280px;height: 140px;}
.progress_move{position: absolute;left:50%;transform: translateX(-50%);z-index: 5;top:-12px;width:300px;height: 170px;}
js:
let bgLineCtx,drawCtx,markCtx;
let markTimeStamp = 0;
let gbProgress = 0;// 初始化画布
initRing(){const query = wx.createSelectorQuery()query.selectAll('#bgline,#drawLine,#drawMove').fields({ node: true, size: true }).exec((res) => {const dpr = wx.getSystemInfoSync().pixelRatio// 1、背景 半圆背景虚线底const bgLineCanvas = res[0][0].nodebgLineCtx = bgLineCanvas.getContext('2d');bgLineCanvas.width = res[0][0].width * dprbgLineCanvas.height = res[0][0].height * dprbgLineCtx.scale(dpr, dpr);bgLineCtx.clearRect(0, 0, 280, 140);bgLineCtx.beginPath()bgLineCtx.strokeStyle = "#aaa";bgLineCtx.lineWidth = 12;bgLineCtx.lineCap = "line";bgLineCtx.setLineDash([2, 12]);bgLineCtx.arc(140,140,130,Math.PI,2*Math.PI);bgLineCtx.stroke();// 2、选中半圆虚线const drawLineCanvas = res[0][1].nodedrawCtx = drawLineCanvas.getContext('2d');drawLineCanvas.width = res[0][1].width * dprdrawLineCanvas.height = res[0][1].height * dprdrawCtx.scale(dpr, dpr);drawCtx.strokeStyle = "#2a82e4";drawCtx.lineWidth = 12;drawCtx.lineCap = "line";drawCtx.setLineDash([2, 12]);this.drawPress(1);// 3、手指滑动const drawMoveCanvas = res[0][2].nodemarkCtx = drawMoveCanvas.getContext('2d');drawMoveCanvas.width = res[0][2].width * dprdrawMoveCanvas.height = res[0][2].height * dprmarkCtx.scale(dpr, dpr);markCtx.translate(150, 150);markCtx.strokeStyle = "#2a82e4";markCtx.lineWidth = 4;markCtx.lineCap = 'round';this.drawRingDot(Math.PI);})
},
// 虚线占比 num为1时有动画效果
drawPress(num){let addNum = gbProgress / 20; // 转到多少 π(分为100份)每次转多少 πfunction draw(x){drawCtx.clearRect(0,0,280,140);drawCtx.beginPath()drawCtx.arc(140,140,130,Math.PI,Math.PI+x);drawCtx.stroke();}function animate(s){if(num == 1){setTimeout(function(){s += addNum;if (s >= gbProgress) {draw(gbProgress);}else {draw(s);animate(s);}}, 20); }else{draw(gbProgress);}}animate(0);
},
// 虚线外的指标
drawRingDot(angle){markCtx.clearRect(-150, -150, 300, 170);markCtx.beginPath()markCtx.moveTo((148)*Math.cos(angle),(148)*Math.sin(angle));markCtx.lineTo((140)*Math.cos(angle),(140)*Math.sin(angle));markCtx.stroke();
},
// 手指触摸
moveDraw(e){let x = e.changedTouches[0].x;let y = e.changedTouches[0].y;if(e.type == "touchstart"){markTimeStamp = parseInt(e.timeStamp);}const radius = 150; // 半圆环的半径let maxDistance = radius+10; // 最大圆的距离let minDistance = radius-30; // 最小圆的距离let distance = Math.sqrt(Math.pow(x-radius, 2) + Math.pow(y-radius, 2));let num = parseInt(e.timeStamp - markTimeStamp);if(e.type=="touchmove" && num >= 200){markTimeStamp = parseInt(e.timeStamp);}if(y >= radius){y = radius}if (distance <= maxDistance && distance >= minDistance) {let radian = Math.atan2(y-radius, x-radius);let realAngle = (radian/ Math.PI+2).toFixed(2)*Math.PI; //弧度转化为角度let pAg = ((radian/ Math.PI+1)*100).toFixed(2);// console.log('val',radian,realAngle,pAg)if(pAg == 200){pAg = 0;}if(pAg >= 0 && pAg <= 100){gbProgress = pAg * (Math.PI/100);this.setData({progress: parseInt(pAg)})this.drawPress(0);}this.drawRingDot(realAngle);}
},

这篇关于小程序 js+Canvas 绘制半圆环虚线进度条的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055442

相关文章

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math