canvas繪製圓環百分比進度的動態效果

canvas繪製圓環百分比進度的動態效果


首先看一下效果圖:
這裏寫圖片描述
原理:
原理很簡單,第一步繪製一個整圓顏色自定義,第二部繪製一個內圓,其半徑要小於外圓顏色自定
最後一步按照百分比繪製第三個圓,顏色自定。
要實現動態繪製第三步的效果,只要添加一個定時器的功能,每隔一段時間繪製一段距離,設定一個閥值
當大於這個閥值得時候就清空這個定時器,這個閥值其實就是要顯示的百分比值。每次繪製0.01.
注意:在定時器內繪製時,要把第二步繪製內圓,空白圓也在定時器中繪製。

繪製公式:arc(x, y, radius, startRad, endRad, anticlockwise)
在canvas畫布上繪製以座標點(x,y)爲圓心、半徑爲radius的圓上的一段弧線。這段弧線的起始弧度是startRad,結束弧度是endRad。這裏的弧度是以x軸正方向(時鐘三點鐘)爲基準、進行順時針旋轉的角度來計算的。anticlockwise表示是以逆時針方向還是順時針方向開始繪製,如果爲true則表示逆時針,如果爲false則表示順時針。anticlockwise參數是可選的,默認爲false,即順時針。
此圖轉載網路
這裏寫圖片描述
頁面創建canvas元素

JS代碼:
function circleProgress(id,value,average){
var canvas = document.getElementById(id);
var context = canvas.getContext(‘2d’);
var _this = $(canvas),
value= Number(44),// 當前百分比,數值
average = Number(33),// 平均百分比
color = “”,// 進度條、文字樣式
maxpercent = 100,//最大百分比,可設置
c_width = _this.width(),// canvas,寬度
c_height =_this.height();// canvas,高度
// 判斷設置當前顯示顏色
if( value== maxpercent ){
color=”#29c9ad”;
}else if( value> average ){
color=”#27b5ff”;
}else{
color=”#ff6100”;
}
// 清空畫布
context.clearRect(0, 0, c_width, c_height);
// 畫初始圓
context.beginPath();
// 將起始點移到canvas中心
context.moveTo(c_width/2, c_height/2);
// 繪製一箇中心點爲(c_width/2, c_height/2),半徑爲c_height/2,起始點0,終止點爲Math.PI * 2的 整圓
context.arc(c_width/2, c_height/2, c_height/2, 0, Math.PI * 2, false);
context.closePath();
context.fillStyle = ‘#ddd’; //填充顏色
context.fill();
// 繪製內圓
context.beginPath();
context.strokeStyle = color;
context.lineCap = ‘square’;
context.closePath();
context.fill();
context.lineWidth = 10.0;//繪製內圓的線寬度

function draw(cur){
    // 畫內部空白  
    context.beginPath();  
    context.moveTo(24, 24);  
    context.arc(c_width/2, c_height/2, c_height/2-10, 0, Math.PI * 2, true);  
    context.closePath();  
    context.fillStyle = 'rgba(255,255,255,1)';  // 填充內部顏色
    context.fill();
    // 畫內圓
    context.beginPath();
    // 繪製一箇中心點爲(c_width/2, c_height/2),半徑爲c_height/2-5不與外圓重疊,
    // 起始點-(Math.PI/2),終止點爲((Math.PI*2)*cur)-Math.PI/2的 整圓cur爲每一次繪製的距離
    context.arc(c_width/2, c_height/2, c_height/2-5, -(Math.PI / 2), ((Math.PI * 2) * cur ) - Math.PI / 2, false);
    context.stroke();
    //在中間寫字  
    context.font = "bold 18pt Arial";  // 字體大小,樣式
    context.fillStyle = color;  // 顏色
    context.textAlign = 'center';  // 位置
    context.textBaseline = 'middle';  
    context.moveTo(c_width/2, c_height/2);  // 文字填充位置
    context.fillText(value+"%", c_width/2, c_height/2-20);
    context.fillText("正確率", c_width/2, c_height/2+20);
}
// 調用定時器實現動態效果
var timer=null,n=0;
function loadCanvas(nowT){
    timer = setInterval(function(){
        if(n>nowT){
            clearInterval(timer);
        }else{
            draw(n);
            n += 0.01;
        }
    },15);
}
loadCanvas(value/100);
timer=null;

};
最後需用調用circleProgress這個方法,並把相應的參數穿進去。

發佈了31 篇原創文章 · 獲贊 20 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章