微信小程式(JAVAScript)實現餅圖
大家好,我是夢辛工作室的靈,近期在製作資料統計類的軟體,所以會用到許多的圖形和圖表,下面我就來說明下餅圖的繪製方法,依舊老規矩,先上效果圖=-=:
看上去還是可以的吧,下面直接來看程式碼,我為了提供程式碼的閱讀性寫了不少變數,不然不好閱讀啊:
function drawCircelChart(that){
let width = app.globalData.width; //手機寬度
let height = app.globalData.height; //手機高度
let data = [ //繪製資料
{
name:"1號",
pre:10,
},
{
name:"2號",
pre:5,
},
{
name:"3號",
pre:20,
},
{
name:"4號",
pre:30,
},
{
name:"5號",
pre:10,
},
{
name:"6號",
pre:25,
},
];
let rectWidth = width * 0.9; //定義畫布寬度
let rectHeight = height * 0.26; //定義畫布高度
let circlePath = width * 0.2; //定義圓的半徑
let ringWidth = 20; //定義 外環的寬度
let centerPoint = { //計算中心中標(圓點)
x:rectWidth / 2,
y:rectHeight / 2
}
let ctx = wx.createCanvasContext('cchart');
ctx.translate(0,40); //畫布下移動
ctx.setFontSize(12); //字型大小
let colorArray = ["#FFC655","#FADD15","#FD7170","#B391DD","#00A0F8","#5DC97D","#50D2C2"
,"#FADB15","#AABD15","#FCDD55","#CB5D15"]; //顏色陣列
let preEndAngel = 0; //上一個資料的結束時的角度
for(var x in data){
//處理資料
//計算當前資料的開始角度和結束角度
let roateAngel = {
start:preEndAngel,
end:preEndAngel + data[x].pre / 100 * 2 * Math.PI,
}
//繪製圓弧
ctx.beginPath();
ctx.moveTo(centerPoint.x,centerPoint.y);
ctx.arc(centerPoint.x, centerPoint.y, circlePath, roateAngel.start,roateAngel.end);
ctx.setFillStyle(colorArray[x] || "#000");
ctx.fill();
preEndAngel = roateAngel.end;
ctx.setFillStyle("#000");
//下面就有點點難度了,其實只要你三角函式學 的號也沒撒,
//下面程式碼就是繪製每個模組的位置
//需要分四種型別,即四象限,不知道大家還記得否
//然後就是已知角度,計算當前圓弧中心點和圓的交點座標
let halfAngel = (roateAngel.end - roateAngel.start) / 2;
let centerAngel = roateAngel.start + halfAngel;
let offset = {
x:10,
y:10
}
let textPoint = {
x:0,
y:0
}
if(centerAngel <= Math.PI / 2){
textPoint.x = centerPoint.x + circlePath * Math.cos(centerAngel) + offset.x;
textPoint.y = centerPoint.y + circlePath * Math.sin(centerAngel) + offset.y;
ctx.setTextAlign("left");
if(centerAngel == Math.PI / 2){
ctx.setTextAlign("center");
textPoint.y = centerPoint.y + circlePath * Math.sin(centerAngel) + offset.y * 2;
}
ctx.setTextBaseline("top");
ctx.fillText(data[x].pre + "%", textPoint.x,textPoint.y);
ctx.setTextBaseline("bottom");
ctx.fillText(data[x].name,textPoint.x,textPoint.y);
} else if(centerAngel < Math.PI){
textPoint.x = centerPoint.x - circlePath * Math.cos(Math.PI - centerAngel) - offset.x * data[x].name.length / 2;
textPoint.y = centerPoint.y + circlePath * Math.sin(Math.PI - centerAngel) + offset.y * data[x].name.length / 2;
ctx.setTextAlign("center");
ctx.setTextBaseline("top");
ctx.fillText(data[x].pre + "%",textPoint.x,textPoint.y);
ctx.setTextBaseline("bottom");
ctx.fillText( data[x].name ,textPoint.x,textPoint.y);
} else if(centerAngel < Math.PI * 3 / 2){
textPoint.x = centerPoint.x - circlePath * Math.cos(centerAngel - Math.PI) - offset.x * data[x].name.length / 2;
textPoint.y = centerPoint.y - circlePath * Math.sin(centerAngel - Math.PI) - offset.y * data[x].name.length / 2;
ctx.setTextAlign("right");
//ctx.setTextBaseline("middle");
ctx.setTextBaseline("top");
ctx.fillText( data[x].pre + "%",textPoint.x,textPoint.y);
ctx.setTextBaseline("bottom");
ctx.fillText(data[x].name ,textPoint.x,textPoint.y);
} else {
textPoint.x = centerPoint.x + circlePath * Math.cos(Math.PI * 2 - centerAngel) + offset.x;
textPoint.y = centerPoint.y - circlePath * Math.sin(Math.PI * 2 - centerAngel) - offset.y;
ctx.setTextAlign("left");
ctx.setTextBaseline("top");
ctx.fillText( data[x].pre + "%",textPoint.x,textPoint.y);
ctx.setTextBaseline("bottom");
ctx.fillText(data[x].name ,textPoint.x,textPoint.y);
}
}
//最後再在中心繪製一個白圓,這樣就是上面的效果啦
ctx.beginPath();
ctx.setFillStyle("#FFFFFF");
ctx.moveTo(centerPoint.x,centerPoint.y);
ctx.arc(centerPoint.x, centerPoint.y, circlePath - ringWidth,0,2 * Math.PI);
ctx.fill();
ctx.draw();
}
相關文章
- 微信小程式echarts-餅狀圖微信小程式Echarts
- 微信小程式--實現圖片懶載入(lazyload)微信小程式
- 當微信小程式遇上TensorFlow:小程式實現微信小程式
- 微信小程式 遮罩功能實現微信小程式遮罩
- 微信小程式實現類3D輪播圖微信小程式3D
- 微信小程式 實現網路圖片本地快取微信小程式快取
- 微信小程式實現軌跡回放,微信原生小程式,基於uniapp的小程式?微信小程式APP
- 微信小程式實現換膚功能微信小程式
- JS實現監控微信小程式JS微信小程式
- 小程式實現微信 【我的】介面
- 微信小程式朋友圈分享圖片生成方案實現微信小程式
- 微信小程式 + 騰訊地圖SDK 實現路線規劃微信小程式地圖
- 使用taro+canvas實現微信小程式的圖片分享功能Canvas微信小程式
- 微信小程式實現WebSocket心跳重連微信小程式Web
- 微信小程式實現星星評分效果微信小程式
- 微信小程式實現釋出作業微信小程式
- 微信,支付寶小程式實現原理概述
- 微信小程式-實現實時聊天功能 前端部分微信小程式前端
- 微信小程式 圖片上傳微信小程式
- 微信小程式設定背景圖微信小程式
- 微信小程式圖片使用示例微信小程式
- 微信小程式:拼圖遊戲微信小程式遊戲
- 當微信小程式遇上TensorFlow:Server端實現微信小程式Server
- 微信小程式實現商城案例(賦原始碼)微信小程式原始碼
- 微信小程式自定義元件實現 tabBar、navBar微信小程式元件tabBar
- 微信小程式如何實現自動退款功能?微信小程式
- 微信小程式實現簽到的日曆微信小程式
- fiddler 實現 微信(PC端)小程式抓包
- 微信小程式實現卡片左右滑動效果微信小程式
- 微信小程式 簡易搜尋功能實現微信小程式
- 微信小程式實現全域性搜尋程式碼高亮微信小程式
- 深入解析微信小程式頁面中實現的儲存圖片(附程式碼)微信小程式
- 10行程式碼實現微信小程式支付功能,使用小程式雲開發實現小程式支付功能(行程微信小程式
- 用mpvue實現的微信小程式版cnode社群Vue微信小程式
- 微信公眾號回覆小程式卡片如何實現?
- 微信小程式Tree自定義控制元件實現微信小程式控制元件
- 微信小程式底部實現自定義動態Tabbar微信小程式tabBar
- 微信小程式實現搜尋關鍵詞高亮微信小程式