uni canvas百分比统计图

在这里插入图片描述

<template>
//我删除了部分代码只留了关键代码
<view class="list" v-for="(item,index) in list" :key="index">
				<canvas class="canvas" :canvas-id="item.canvas"></canvas>
			</view>
</template>

<script>
export default {
	data() {
		return {
			list:[
				{
					sum:100, //总数
					val:50, //实际值
					valArr:0, //固定0开始
					canvas:'myCanvas1' // canvasid
				},
				{
					sum:120,
					val:30,
					valArr:0,
					canvas:'myCanvas2',
				},
				{
					sum:100,
					val:50,
					valArr:0,
					canvas:'myCanvas3',
				}
			]
		};
	},
	mounted() {
		for(let i = 0;i<this.list.length;i++){
			this.Progressbar(this.list[i]);
		}
	},
	methods: {
		Progressbar(canvas) {
			//根据后台获取到的数据计算比例
			let sum = canvas.sum==0?1:canvas.sum; // 总计
			let newVal = parseFloat(((canvas.val / sum)*100).toFixed(1)) //展示概率
			let val = parseFloat(((canvas.valArr / sum) * 2).toFixed(1)); //实际
			const ctx = uni.createCanvasContext(canvas.canvas); //拿到canvas对象(自己的定义的canvas-id)
			// 开始绘制第一条路径 总数 红色
			ctx.beginPath(); // 开始绘制路径
			ctx.arc(50, 50, 45, 0, 3 * Math.PI); // arc画圆
			ctx.setStrokeStyle('#f2f2f2'); // 线条颜色
			ctx.setLineWidth(5); // 线条宽度
			ctx.stroke(); // 绘制成线条(fill()是填充为饼图)
			// 开始绘制第二条路径 成交 橘色
			ctx.beginPath();
			ctx.arc(50,50, 45, 0, val * Math.PI);
			ctx.setStrokeStyle('#00cc8b');
			ctx.setLineWidth(5);
			ctx.stroke();
			// 填充字体-367
			ctx.setFillStyle('#FF7400');
			ctx.setFontSize(25);
			ctx.setTextAlign('center');
			ctx.fillText(newVal, 50, 60);
			ctx.stroke();
			// 填充字体-累计推荐
			ctx.setFillStyle('#FF7400');
			ctx.setFontSize(13);
			ctx.fillText('%', 70, 60);
			ctx.stroke();
			// 渲染
			ctx.draw();
			//绘制动画效果
			if (canvas.valArr < canvas.val) {
				canvas.valArr = canvas.valArr + 5;
				if(canvas.valArr>canvas.val){
					canvas.valArr = canvas.val
					return
				}
			}
			if (canvas.valArr <= canvas.val) {
				setTimeout(() => {
					this.Progressbar(canvas);
				}, 20);
			}
		}
	}
};
</script>

<style lang="less">
//这里单位用的px因为canvas画的单位都是px,使用rpx则容易错位
.canvas {
	width: 100px;
	height: 100px;
}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值