小程序 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

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图