微信小程序手写饼状图,非wx-echarts库,简洁易懂,不占代码体积!!!

写在前面:小程序也有echarts组件库,但是我觉得太占代码量了,本来小程序的体积只有2m。在下载个组件库。那就没多少了。索性就手写一个。
实现效果:
在这里插入图片描述
布局

<view class="left">
	<cover-view class="white"></cover-view>
	<canvas style="width: 136px; height: 136px;" canvas-id="Canvas"></canvas>
</view>

样式

page {
	width: 100%;
	height: 100%;
}
 
.left {
	width: 300rpx;
	height: 300rpx;
	display: flex;
	justify-content: center;
	align-items: center;
	position: relative;
}
 
.white {
	width: 136rpx;
	height: 136rpx;
	border-radius: 50%;
	position: absolute;
	top: 50%;
	left: 50%;
	z-index: 10;
	background-color: #fff;
	transform: translate(-50%, -50%);
}

实现效果

Page({
 
	/**
	 * 页面的初始数据
	 */
	data: {
		messarr: [{
				color: '#464af8',
				num: '20',
				flownum: '20',
			},
			{
				color: '#ff6262',
				num: '50',
				flownum: '50',
			},
			{
				color: '#f7c11b',
				num: '60',
				flownum: '60',
			},
			{
				color: '#ff8015',
				num: '80',
				flownum: '80',
			},
			{
				color: '#17d0bc',
				num: '20',
				flownum: '20',
			}
		]
	},
 
	/**
	 * 生命周期函数--监听页面加载
	 */
	onLoad: function(options) {
 
	},
 
	/**
	 * 生命周期函数--监听页面初次渲染完成
	 */
	onReady: function() {
      // 初始化
		const ctx = wx.createCanvasContext('Canvas');
		// 设置圆点 x  y   中心点
		let number = {
			x: 68,
			y: 68
		};
		// 获取数据 各类项的个数
		let term = this.data.messarr;
		let termarr = [];
		for (let t = 0; t < term.length; t++) {
			// flownum
			let thisterm = Number(term[t].flownum)
			let thiscolor = term[t].color
			termarr.push({
				data: thisterm,
				color: thiscolor
			})
		}
		console.log(termarr)
		// 设置总数
		let sign = 0;
		for (var s = 0; s < termarr.length; s++) {
			sign += termarr[s].data
		}
		//设置半径 
		let radius = 60;
		for (var i = 0; i < termarr.length; i++) {
			var start = 0;
			// 开始绘制
			ctx.beginPath()
			if (i > 0) {
				for (var j = 0; j < i; j++) {
					start += termarr[j].data / sign * 2 * Math.PI
				}
			}
			var end = start + termarr[i].data / sign * 2 * Math.PI
			ctx.arc(number.x, number.y, radius, start, end);
			ctx.setLineWidth(1);
			ctx.lineTo(number.x, number.y);
			ctx.setStrokeStyle('#fff');
			ctx.setFillStyle(termarr[i].color);
			ctx.fill();
			ctx.closePath();
			ctx.stroke();
		}
		ctx.draw()
	},
 
})

码字不易,在线求个三连支持。

大家记得收藏前,先点个赞哦!好的文章值得被更多人看到。

关注江哥不迷路,带你编程上高速。

微信公众号关注:江小鱼吧 免费领取高级前端学习资料,转身涨薪20K

支付宝生态技术学习交流群:
加入Q群与更多BAT一线大佬深度交流:1136157571 (点我入群)


posted @ 2021-09-02 10:47  江咏之  阅读(412)  评论(0编辑  收藏  举报