155 lines
4.2 KiB
JavaScript
155 lines
4.2 KiB
JavaScript
function drawCircle(obj) {
|
|
var drawing_elem = document.getElementById(obj.drawing_elem);
|
|
var width = drawing_elem.width;
|
|
var height = drawing_elem.height;
|
|
var percent = +drawing_elem.getAttribute("data-value");
|
|
var percentfontcolor = obj.percentfontcolor;
|
|
var unitfontcolor = obj.unitfontcolor;
|
|
var percentfontsize = obj.percentfontsize || 15;
|
|
var unitfontsize = obj.unitfontsize || 15;
|
|
var unitvalue = obj.unitvalue || "%";
|
|
var bgcolor = obj.bgcolor || "";
|
|
var forecolor = obj.forecolor;
|
|
var lineWidth = obj.lineWidth || 12;
|
|
var speedstep = obj.speedstep || 3;
|
|
var addLeft = obj.addLeft || 0;
|
|
var lineGap = obj.lineGap || "";
|
|
var center_x = width / 2;
|
|
var center_y = height / 2;
|
|
var rad = obj.rad || (Math.PI * 2) / 100;
|
|
var radStart = obj.radStart || 0;
|
|
var radEnd = obj.radEnd || Math.PI * 2;
|
|
var radDrawStart = obj.radDrawStart || (-Math.PI * 1) / 2;
|
|
var unitadd = obj.unitadd || (-Math.PI * 1) / 2;
|
|
var speed = 0;
|
|
|
|
var context = drawing_elem.getContext("2d");
|
|
|
|
// 绘制背景圆圈
|
|
function drawOuterCircle() {
|
|
context.save();
|
|
context.lineWidth = lineWidth;
|
|
var radius = center_x - context.lineWidth;
|
|
if (Object.prototype.toString.call(bgcolor) === "[object Array]") {
|
|
var gradient = context.createLinearGradient(height, 0, 0, 0);
|
|
bgcolor.forEach(function (item) {
|
|
gradient.addColorStop(item.step, item.color);
|
|
});
|
|
context.strokeStyle = gradient;
|
|
} else {
|
|
context.strokeStyle = bgcolor;
|
|
}
|
|
if (lineGap) {
|
|
context.lineCap = lineGap;
|
|
}
|
|
context.beginPath();
|
|
context.arc(center_x, center_y, radius, radStart, radEnd, false);
|
|
context.stroke();
|
|
context.closePath();
|
|
context.restore();
|
|
}
|
|
|
|
//绘制运动圆环
|
|
function drawInnerCircle(n) {
|
|
context.save();
|
|
context.lineWidth = lineWidth;
|
|
var radius = center_x - context.lineWidth;
|
|
if (Object.prototype.toString.call(forecolor) === "[object Array]") {
|
|
var gradient = context.createLinearGradient(height, 0, 0, 0);
|
|
forecolor.forEach(function (item) {
|
|
gradient.addColorStop(item.step, item.color);
|
|
});
|
|
context.strokeStyle = gradient;
|
|
} else {
|
|
context.strokeStyle = forecolor;
|
|
}
|
|
if (lineGap) {
|
|
context.lineCap = lineGap;
|
|
}
|
|
context.beginPath();
|
|
context.arc(
|
|
center_x,
|
|
center_y,
|
|
radius,
|
|
radDrawStart,
|
|
radDrawStart + n * rad,
|
|
false
|
|
);
|
|
context.stroke();
|
|
context.closePath();
|
|
context.restore();
|
|
}
|
|
|
|
//绘制文字
|
|
function drawText(n) {
|
|
//声明%
|
|
context.save();
|
|
context.font = unitfontsize + "px Helvetica";
|
|
var text1_width = context.measureText(unitvalue).width;
|
|
context.restore();
|
|
|
|
//绘制数字
|
|
context.save();
|
|
var font_size = percentfontsize;
|
|
var text_value = "";
|
|
if (n % parseInt(n) > 0 && n % parseInt(n) < 1) {
|
|
text_value = n.toFixed(2);
|
|
} else if (n % parseInt(n) === 0 || n == 0) {
|
|
text_value = n.toFixed(0);
|
|
}
|
|
context.fillStyle = percentfontcolor;
|
|
context.font = font_size + "px Helvetica";
|
|
var text_width = context.measureText(text_value).width;
|
|
context.fillText(
|
|
text_value,
|
|
center_x - text_width / 2 - text1_width / 2 + addLeft,
|
|
center_y + font_size / 2
|
|
);
|
|
context.restore();
|
|
|
|
//绘制%
|
|
context.save();
|
|
context.fillStyle = unitfontcolor;
|
|
context.fillText(
|
|
unitvalue,
|
|
center_x - text_width / 2 + text_width - text1_width / 2 + addLeft,
|
|
center_y + unitfontsize / 2 + unitadd
|
|
);
|
|
context.restore();
|
|
}
|
|
|
|
// 绘制
|
|
function startDraw(speed) {
|
|
context.save();
|
|
context.clearRect(0, 0, width, height);
|
|
if (bgcolor) {
|
|
drawOuterCircle();
|
|
}
|
|
drawText(speed);
|
|
if (speed != 0) {
|
|
drawInnerCircle(speed);
|
|
}
|
|
context.restore();
|
|
}
|
|
|
|
// 执行动画
|
|
(function drawFrame() {
|
|
if (percent == 0) {
|
|
startDraw(speed);
|
|
return;
|
|
}
|
|
if (speed >= percent) {
|
|
speed = percent;
|
|
startDraw(speed);
|
|
return;
|
|
}
|
|
if (percent - speed >= speedstep) {
|
|
speed += speedstep;
|
|
} else {
|
|
speed += percent - speed;
|
|
}
|
|
startDraw(speed);
|
|
window.requestAnimationFrame(drawFrame);
|
|
})();
|
|
}
|