.xml
<view class="left">
<cover-view class="white"></cover-view>
<canvas style="width: 136px; height: 136px;" canvas-id="Canvas"></canvas>
</view>
.wxss
.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%);
}
.js
data: {
messarr: [{
color: '#5fb0f1',
num: '20',
flownum: '20',
},
{
color: '#ffb822',
num: '50',
flownum: '50',
},
{
color: '#e4007f',
num: '60',
flownum: '60',
},
{
color: '#ff0000',
num: '80',
flownum: '80',
}
]
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
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()
},
不喜欢多说废话所以直接上代码,是我状态的项目需求通过参考其他博主文章才成功的,忘记是哪篇文章了所以也没有转载连接