小程序canvas画环形百分比进度图

ops/2025/1/2 6:03:05/

在这里插入图片描述

组件封装

component/canvas-ring目录下

canvas-ring.js

<canvas style="width:{{canvasWidth}}px;height:{{canvasWidth}}px; margin:0 auto;position:relative" type="2d" id="myCanvas"><view class="circle-bar" style="height:{{canvasWidth}}px;"><view class="title_val" style="color: {{valueColor}}; font-weight:{{f_weight}}; margin-top:{{show_tip?'10':'0'}}rpx;font-size:{{f_size}}px">{{value}}<p style="font-size: 10px;display: inline;">{{suffix}}</p></view><view class="title_name" style="color: {{lineColor}};">{{title}}</view></view>
</canvas>
canvas-ring.json
{"component": true,"usingComponents": {} }
canvas-ring.wxss
.circle-bar{width: 100%;display: flex;flex-direction: column;justify-content: center;align-items: center;text-align: center;position: absolute;top: 0;
}
.circle-bar .title_name{max-height: 62rpx;font-size: 26rpx;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;
}
.circle-bar .title_val{color: #333333;
}
canvas-ring.js
var windWidth = wx.getSystemInfoSync().windowWidth; //这里获取下设备的屏幕宽度Component({/*** 组件的属性列表*/properties: {//画布的宽度 默认占屏幕宽度的0.4倍canvasWidth: {type: Number,value: windWidth * 0.4},//线条宽度 默认10lineWidth: {type: Number,value: 10},//线条颜色lineColor: {type: String,value: "#3696FA"},//标题 默认“完成率”title: {type: String,value: "完成率"},//当前的值 默认45value: {type: Number,value: 50},//值的颜色 默认””valueColor: {type: String,value: "#333"},//值的字体的大小颜色 默认f_size: {type: Number,value: 14},f_weight: {type: String,value: "500"},//最大值 默认100maxValue: {type: Number,value: 100},//最小值 默认0minValue: {type: Number,value: 0},//当前值的后缀名suffix: {type: null,value: "%"},//从什么角度开始 0~360之间 (12点方向为0,18点方向为180,0点方向为360)startDegree: {type: Number,value: 0}},data: {canvasWidth: windWidth * 0.4, //默认创建的环形图宽度为屏幕宽度的40%show_tip: true},methods: {drawCanvasRing() {//没标题的时候去掉margin-top的值if (this.data.title.replace(/(^\s*)|(\s*$)/g, "").length == 0) {this.setData({show_tip: false})}//canvas 2dconst query = wx.createSelectorQuery().in(this);query.select("#myCanvas").fields({node: true,size: true}).exec(this.init.bind(this))},init(res) {const canvas = res[0].nodeconst ctx = canvas.getContext("2d");canvas.requestAnimationFrame(() => {})const dpr = wx.getSystemInfoSync().pixelRatiocanvas.width = res[0].width * dprcanvas.height = res[0].height * dprctx.scale(dpr, dpr);// 大小值的计算var circle_r = this.data.canvasWidth / 2; //画布的一半,用来找中心点和半径var startDegree = this.data.startDegree; //从什么角度开始var maxValue = this.data.maxValue; //最大值var minValue = this.data.minValue; //最小值var value = this.data.value; //当前的值var lineColor = this.data.lineColor; //线条颜色var lineWidth = this.data.lineWidth; //线条宽度var percent = 360 * ((value - minValue) / (maxValue - minValue)); //计算结果//定义起始点ctx.translate(circle_r, circle_r);//灰色圆弧ctx.beginPath();ctx.strokeStyle = "#ebebeb";ctx.lineWidth = lineWidth;ctx.arc(0, 0, circle_r - 10, 0, 2 * Math.PI, true);ctx.stroke();ctx.closePath();//有色彩的圆弧ctx.beginPath();ctx.strokeStyle = lineColor;ctx.lineWidth = lineWidth;ctx.arc(0, 0, circle_r - 10, startDegree * Math.PI / 180 - 0.5 * Math.PI, percent * Math.PI / 180 + startDegree * Math.PI / 180 - 0.5 * Math.PI, false);ctx.stroke();ctx.closePath();console.log(this.data.value);}}
})

使用

父页面

canvas.js
  /*** 页面的初始数据*/data: {completePercent: 10, //圆环A的动态值completePercent2: 60 //圆环B的动态值},
  /*** 生命周期函数--监听页面加载*/onLoad: async function (options) {await tools.request('/main/mainTest', {id: 1,}, 'get').then((res) => {if (res.data.code == 1) {this.setData({completePercent: res.data.data.score.before,completePercent2: res.data.data.score.finish,})} else {wx.showToast({title: res.data.msg,icon: 'none',})}})await    this.getRingsA();
await    this.getRingsB();},

方法

  getRingsA() {this.canvasRing = this.selectComponent("#canringA");this.canvasRing.drawCanvasRing() //绘制圆环A},getRingsB() {this.canvasRing2 = this.selectComponent("#canringB");this.canvasRing2.drawCanvasRing() //绘制圆环B},
canvas.wxml
 <canvas2d-ring type="2d" id="canringA" canvasWidth="{{120}}" f_weight="bold" value="{{completePercent}}" lineColor="#EA0000" f_size="21" lineWidth="{{10}}" title="{{'施工前'}}"></canvas2d-ring>
canvas.json
{  "navigationStyle":"custom","component": true,"usingComponents": {"canvas2d-ring": "/component/canvas-ring/canvas-ring"}
}

http://www.ppmy.cn/ops/146324.html

相关文章

Jenkins 命令行多线程并发下载制品包

为什么要用 Jenkins 命令行&#xff1f; 对于在日常学习、工作中喜欢在命令行终端的同学而言&#xff0c;自然不用做过多的解释&#xff0c;甚至希望能能在命令行中搞定一切&#xff0c;比如&#xff1a;播放歌曲、提交代码、搜索文件等等。毕竟&#xff0c;命令行要比来回切换…

25秋招面试总结

秋招从八月底开始&#xff0c;陆陆续续面试了不少&#xff0c;现在也是已经尘埃落定&#xff0c;在这里做一些总结一些我个人的面试经历 腾讯 腾讯是我最早面试的一家&#xff0c;一开始捞我面试的是数字人民币&#xff0c;安全方向的岗位&#xff0c;属于腾讯金融科技这块。…

第1关:博客系统数据库设计与实现之查询

任务描述 本关任务&#xff1a;通过 JDBC 的方式查询 MySQL 表 t_user 中的数据。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; JDBC 如何连接数据库&#xff1b; JDBC 如何查询表中数据。 JDBC JDBC&#xff08;Java DataBase Connectivity&#xff09;是…

开源软件兼容性可信量化分析

开源软件兼容性可信量化分析 课程&#xff1a;软件质量分析 作业 开源软件兼容性问题严重程度分成哪4级&#xff1f;分别表示什么风险&#xff1f;版本间兼容性可信度量公式什么&#xff1f;等级划分表是什么&#xff1f;阐述软件间兼容性测试框架以及面向Java和C的工具平台框…

.net core 的循环实现

Python基础 引言 Python是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法、强大的功能和广泛的应用场景而受到开发者的青睐。从网页开发到数据分析&#xff0c;从人工智能到自动化脚本&#xff0c;Python无处不在。本篇文章将深入探讨Python的基本概念、语法以及一些…

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot&#xff0c;对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解&#xff1b; 面试题 Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f;Spring Boot的自动配置原理是什么&#xff1f;你如何理解 Spring Boot 配置…

AI与云计算:天作之合

站在云计算的视角&#xff0c;我常常感慨AI和云计算的结合就像是一场完美的双向奔赴。记得有次在技术分享会上&#xff0c;一位同行打趣道&#xff1a;“这简直是科技界最浪漫的牵手&#xff01;” 云为AI提供算力支持&#xff0c;这点毋庸置疑。还记得前阵子帮一家初创公司搭…

openssl 安装及使用

OpenSSL 是一个强大的开源加密库&#xff0c;提供了一系列密码学功能&#xff0c;包括加密、解密、数字签名、证书生成和管理等。它同时也是一个通用的 SSL/TLS 协议实现&#xff0c;用于安全地传输数据。您可以使用 OpenSSL 来创建和管理证书、进行加密通信&#xff0c;以及执…