首先是wxml代碼:
<view class="canvasContainer clearfix">
<!-- 第一個 -->
<view class='progress_box' style='height:{{canvasW + 40}}px;width:{{canvasW}}px;' wx:for="{{canvasData}}" wx:key="*this">
<canvas class="progress_bg" canvas-id="canvasProgressbg-{{index}}" style='height:{{canvasW}}px;width:{{canvasW}}px;'> </canvas>
<canvas class="progress_canvas" canvas-id="canvasProgress-{{index}}" style='height:{{canvasW}}px;width:{{canvasW}}px;'> </canvas>
<view class="progress_text">
<!-- <image src='../../image/{{imgarr[index]}}'></image> -->
</view>
<view class='equName'>
<text>{{equName[index]}}:</text>
<text>11/2{{index}}</text>
</view>
</view>
</view>
<!-- <cover-view>遮布層 -->
<cover-view class='stationBox' animation="{{animation}}">
<cover-view class='tips' bindtap='moveBtn'>
<!-- <cover-image src='{{imgUrl}}'></cover-image> -->
</cover-view>
<cover-view class='station'>
<cover-view class='list-item-title'>
<cover-view>房間列表</cover-view>
<!-- <cover-image src='../../image/sx.png' catchtap='sxBtn'></cover-image> -->
</cover-view>
<cover-view class='select'>
<block wx:for="{{[1,2,3,4,5,7,8,9,10,11,12,13,14]}}" wx:key="this">
<cover-view class='list-item-box textEllipsis'>
測試呀---{{index}}
</cover-view>
</block>
</cover-view>
</cover-view>
</cover-view>
樣式代碼,WXSS文件
/* canvas畫圓的樣式 */
.progress_box {
position: relative;
/* 這里的寬高是必須大於等於canvas圓環的直徑 否則繪制到盒子外面就看不見了,一開始設置 width:440rpx; height:440rpx; 發現 在360X640分辨率的設備,下繪制的圓環跑盒子外去了,小程序使用rpx單位適配 ,但是canvas繪制的是px單位的。所以只能用px單位繪制的圓環在盒子內顯示 */
/* width: 220px;
height: 220px; */
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
float: left;
}
.progress_bg {
position: absolute;
/* width: 220px;
height: 220px; */
}
.progress_canvas {
/* width: 220px;
height: 220px; */
}
.progress_text {
position: absolute;
display: flex;
align-items: center;
justify-content: center;
}
.progress_info {
font-size: 36rpx;
padding-left: 16rpx;
letter-spacing: 2rpx;
}
.progress_dot {
width: 16rpx;
height: 16rpx;
border-radius: 50%;
background-color: #fb9126;
}
.progress_text image {
width: 3rem;
height: 3rem;
}
.equName {
position: absolute;
bottom: 0;
display: flex;
font-size: 0.8rem;
}
/* 清除浮動 */
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.cfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
zoom: 1;
}
js代碼:
const app = getApp()
Page({
data: {
imgarr: ["cjq.png", "fj.png", "sj.png", "kt.png"],
wrapColor: ["#40a1ff", "#4ecb76", "#955ee1", "#e37254"],
equName: ["空調", "風機", "采集器", "水浸"]
},
onLoad: function() {
this.dataFun();
},
/**
* 生命周期函數--監聽頁面初次渲染完成
*/
onReady: function() {
let windW = wx.getSystemInfoSync().windowWidth;
let canvasW = windW / 3;
this.setData({
canvasW: canvasW
});
var arr = [1, 2, 3, 4];
for (let i = 0; i < arr.length; i++) {
//底層canvas的ID
let canvasID = "canvasProgressbg-" + i;
//外層canvas的ID
let wrapCanvasID = "canvasProgress-" + i;
this.drawProgressbg(canvasID, canvasW);
this.drawCircle(arr[i] * 0.5, wrapCanvasID, canvasW, this.data.wrapColor[i]);
}
},
//延遲模擬數據
dataFun: function() {
//延遲500ms,模擬網絡請求時間
setTimeout(() => {
this.setData({
canvasData: [1, 2, 3, 4]
})
}, 500)
},
// 畫圓函數
drawProgressbg: function(canvasId, canvasW) {
let ctx = wx.createCanvasContext(canvasId, this);
ctx.setLineWidth(8); // 設置圓環的寬度
ctx.setStrokeStyle('#404c58'); // 設置圓環的顏色
ctx.setLineCap('round') // 設置圓環端點的形狀
ctx.beginPath(); //開始一個新的路徑
ctx.arc(canvasW / 2, canvasW / 2, canvasW / 2 - 20, 0, 2 * Math.PI, false);
//設置一個原點(110,110),半徑為100的圓的路徑到當前路徑
ctx.stroke(); //對當前路徑進行描邊
ctx.draw();
},
// 畫彩色圓環的函數drawCircle
drawCircle: function(step, wrapCanvasID, canvasW, wrapColor) {
let context = wx.createCanvasContext(wrapCanvasID);
// 設置漸變
var gradient = context.createLinearGradient(200, 100, 100, 200);
gradient.addColorStop("0", wrapColor);
gradient.addColorStop("0.5", wrapColor);
gradient.addColorStop("1.0", wrapColor);
context.setLineWidth(8);
context.setStrokeStyle(gradient);
context.setLineCap('square')
context.beginPath();
// 參數step 為繪制的圓環周長,從0到2為一周 。 -Math.PI / 2 將起始角設在12點鍾位置 ,結束角 通過改變 step 的值確定
context.arc(canvasW / 2, canvasW / 2, canvasW / 2 - 20, -Math.PI / 2, step * Math.PI - Math.PI / 2, false);
context.stroke();
context.draw()
}
})
