国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

canvas繪制圖表(二)

MyFaith / 1050人閱讀

摘要:圖表是數據表示的一種直觀的形式,前端開發經?;睾蠄D表打交道,一般都會借用第三方的庫,如等,但如果只是很簡單的圖標,我們完全可以自己繪制,現在我們來繪制一個簡單的百分比展示圖表最終效果如下代碼額,很簡單,隨便放在某個地方分析從最終效果來看,這

圖表是數據表示的一種直觀的形式,前端開發經?;睾蠄D表打交道,一般都會借用第三方的js庫,如echats、bizchats等,
但如果只是很簡單的圖標,我們完全可以自己繪制,現在我們來繪制一個簡單的百分比展示圖表

最終效果如下

html代碼

額,很簡單,隨便放在html某個地方

分析

從最終效果來看,這個圖表由6部分組成
1.最大的外圈
2.最中心向外的內二圈
3.最里面的內圈
4.帶顏色的多個圓弧組成的彩圈
5.中心的指針
6.數字文字

下來就按照順序繪制出來

配置

首先還是寫一些可配置的變量

let r = 100,     //半徑
    cx = 0,         //圓心位置
    cy = 0,
    parts = [     //彩條
        "#78C77C","#F3D263","#FC9136","#FB574A","#AE1A51","#8F66DD"
    ], 
    texts = [     //文字段落
        0,30,60,90,120,150
    ],
    pad = 1/100, //間隙
    data = 0.5  //數據,百分比,20%應寫成0.2
初始化
let canvas = document.getElementById("chart")
canvas.width = 262;
canvas.height = 262;
let ctx = canvas.getContext("2d")
ctx.translate(canvas.width/2,canvas.height/2);
ctx.save()
ctx.rotate(0.5*Math.PI)

為什么要旋轉0.5π呢,因為為了便于計算,需要把圓的起始位置轉至最下

繪制-外圈
ctx.beginPath()
ctx.arc(cx,cy,r+30,0,2*Math.PI)
ctx.fillStyle="#fff"
ctx.strokeStyle="gray"

ctx.shadowOffsetX = 0; // 陰影Y軸偏移
ctx.shadowOffsetY = 0; // 陰影X軸偏移
ctx.shadowBlur = 1; // 模糊尺寸
ctx.shadowColor = "rgba(0, 0, 0, 0.5)"; // 顏色
ctx.stroke();
ctx.fill();
效果

繪制-內二圈
ctx.beginPath()
ctx.arc(cx,cy,r-20,0,2*Math.PI)
ctx.fillStyle="#F2F1F3"
ctx.fill();
效果

注意

為什么不先繪制最內層的圈,因為canvas的層級關系是后來者居上,所以有重疊的部分最上面的圖形最后繪制

繪制-內圈
ctx.beginPath()
ctx.arc(cx,cy,r-20-30,0,2*Math.PI)
ctx.fillStyle="#fff"
ctx.strokeStyle="#fff"
ctx.stroke();
ctx.fill();
效果

繪制-彩圈

這里可以理解為多個同心圓弧,把2π等分,中間有相同的間隔

let startRad = 0
let partRad = ( 2 - (pad*parts.length) ) / parts.length
parts.forEach((color,index)=>{
    if (index===0) {
        startRad += pad/2
    } else {
        startRad += pad + partRad
    }
    
    ctx.beginPath()
    ctx.strokeStyle = color
    ctx.lineWidth = 20
    ctx.arc(cx,cy,r,startRad * Math.PI,(startRad+partRad)*Math.PI)
    ctx.stroke()
})
ctx.restore();
注意

1.等分2π的時候別忘了間隔
2.下一個圓弧的起始點是上一個圓弧的終點加上間隔

效果

繪制-指針
ctx.save();
ctx.rotate(data*2*Math.PI)    
ctx.beginPath()
ctx.moveTo(-6,0)
ctx.lineTo(0,r-30)
ctx.lineTo(6,0)
ctx.closePath();
ctx.fillStyle = "#4394F8";
ctx.fill();
ctx.beginPath()
ctx.arc(0,0,10,0,2*Math.PI)
ctx.fillStyle = "#F4F6F9";
ctx.strokeStyle = "gray"
ctx.strokeWidth = 1
ctx.shadowOffsetX = 0; // 陰影Y軸偏移
ctx.shadowOffsetY = 0; // 陰影X軸偏移
ctx.shadowBlur = 10; // 模糊尺寸
ctx.shadowColor = "#F4F6F9"; // 顏色
ctx.stroke()
ctx.fill();
ctx.restore();
注意

1.指針由2部分構成,中心的圓形三角形
2.注意是圓形在上,三角形在下,所以最后繪制圓形

效果

繪制-文字
ctx.save()
ctx.rotate(0.5*Math.PI)
let beginRotate = 0,
    textPartRad = 2/(texts.length)
texts.forEach((text,index)=>{
    if (index!=0) {
        beginRotate = beginRotate + textPartRad
    }
    ctx.save();
    ctx.beginPath()
    ctx.font = "15px"
    ctx.textAlign = "center"
    ctx.textBaseline = "middle"
    ctx.translate(cx+Math.cos(beginRotate*Math.PI)*(r-35),cy+Math.sin(beginRotate*Math.PI)*(r-35));
    ctx.rotate(beginRotate*Math.PI+(-0.5*Math.PI))
    ctx.rotate(Math.PI)
    ctx.fillText(text,0,0)
    ctx.restore();
})
ctx.restore();
注意

1.每個文字先放到最中間(0,0)
2.然后根據圓的半徑和文字放置地點的旋轉角度,通過三角函數計算出位置,然后移動
3.根據旋轉角度將文字旋轉到合適位置

完整代碼



    
    Chart


    


還有許多可以優化的地方,如代碼中顏色,局部位置的距離等等,可以做成配置項,有時間在優化吧^_^

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106141.html

相關文章

  • 螞蟻金服新一代數據可視化引擎 G2

    摘要:新公司已經呆了一個多月,目前著手一個數據可視化的項目,數據可視化肯定要用到圖形庫如等,經決定我的這個項目用阿里旗下螞蟻金服所開發的圖表庫。數據提示框內提示的信息還可以通過格式化函數動態指定。 新公司已經呆了一個多月,目前著手一個數據可視化的項目,數據可視化肯定要用到圖形庫如D3、Highcharts、ECharts、Chart等,經決定我的這個項目用阿里旗下螞蟻金服所開發的G2圖表庫。...

    animabear 評論0 收藏0

發表評論

0條評論

MyFaith

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<