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

相关文章

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 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失