小程序 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的桌面应用程序,使用了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丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3