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

news/2024/12/27 4:42:46/

在这里插入图片描述

组件封装

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/news/1558434.html

相关文章

安卓开发实现图像处理相关功能

彩色图像转换黑白图像实验 基本图形绘制与填充实验 Mat像素操作实验 图像滤波实验 图像轮廓特征检测实验 图像局部特征检测实验 人脸美颜

中国量子计算机领域的发展现状与展望

中国量子计算机领域的发展现状与展望 摘要 随着全球科技竞争的加剧&#xff0c;量子计算作为前沿技术领域备受瞩目。中国在量子计算机的研发方面取得了显著进展&#xff0c;本文将深入探讨中国量子计算机领域的现状、取得的成果、面临的挑战以及未来的发展方向&#xff0c;并…

C++简明教程(10)(初识类)

类的教程 C 类的完整教程 C 中&#xff0c;类&#xff08;class&#xff09;是面向对象编程的核心概念&#xff0c;用于定义对象的属性&#xff08;数据成员&#xff09;和行为&#xff08;成员函数&#xff09;。本教程将带你从零开始&#xff0c;循序渐进地学习如何定义和使…

挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存

一 文件和流 如何从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream&#xff0c;它定义了三个新的数据类型&#xff1a; 数据类型描述ofstream该数据类型表示输出文件流&#xff0c;用于创建文件并向文件写入信息。ifstream该数据类型表示输入文件流&#…

大型语言模型(LLMs)演化树 Large Language Models

大型语言模型&#xff08;LLMs&#xff09;演化树 Large Language Models flyfish 下面的图来自论文地址 Transformer 模型&#xff08;如 BERT 和 GPT-3&#xff09;已经给自然语言处理&#xff08;NLP&#xff09;领域带来了革命性的变化。这得益于它们具备并行化能力&…

【ES6复习笔记】Map(14)

概念 Map 是 JavaScript 中的一种数据结构&#xff0c;它允许你存储键值对&#xff0c;并且可以通过键来访问对应的值。在本教程中&#xff0c;我们将学习如何声明、添加、删除、获取和遍历 Map 集合。 ES6 提供了 Map 数据结构。它类似于对象&#xff0c;也是键值对的集合。…

MFC/C++学习系列之简单记录1——错误解决与Dialog移植

MFC/C学习系列之简单记录1 前言MFC application已停止工作Dialog移植MFC中的去边框设置总结 前言 最近接触MFC&#xff0c;接手一个项目&#xff0c;基于MFC架构编写的&#xff0c;在跑通代码的过程中出现的问题进行简单记录。 MFC application已停止工作 在代码移植过程中&a…

“黄师日报”平安小程序springboot+论文源码调试讲解

第2章 开发环境与技术 基于web的“黄师日报”平安小程序的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对基于web的“黄师日报”平安小程序用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#…