230 lines
6.1 KiB
JavaScript
230 lines
6.1 KiB
JavaScript
function drawCircle(obj) {
|
|
var drawing_elem = document.getElementById(obj.drawing_elem);
|
|
var percent = +drawing_elem.getAttribute("data-value");
|
|
// drawing_elem = setupCanvas(drawing_elem)
|
|
var width = drawing_elem.width;
|
|
var height = drawing_elem.height;
|
|
var percentfontcolor = obj.percentfontcolor;
|
|
var unitfontcolor = obj.unitfontcolor;
|
|
var percentfontsize = obj.percentfontsize || 15;
|
|
var unitfontsize = obj.unitfontsize || 15;
|
|
var unitvalue = obj.unitvalue || "%";
|
|
var bordercolor = obj.bordercolor || "";
|
|
var borderwidth = obj.borderwidth || 0;
|
|
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 title = obj.title || "";
|
|
var titlefontcolor = obj.titlefontcolor || "";
|
|
var titlefontsize = obj.titlefontsize || 15;
|
|
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 setupCanvas(canvas) {
|
|
// var dpr = (scale = window.devicePixelRatio || 1);
|
|
// var rect = canvas.getBoundingClientRect();
|
|
// canvas.width = rect.width * dpr;
|
|
// canvas.height = rect.height * dpr;
|
|
// canvas.style.width = rect.width + "px";
|
|
// canvas.style.height = rect.height + "px";
|
|
// return canvas;
|
|
// }
|
|
|
|
// 绘制边框圆环
|
|
function drawOuterBorderCircle() {
|
|
// 第一个圆
|
|
context.save();
|
|
context.lineWidth = borderwidth;
|
|
context.beginPath();
|
|
context.arc(
|
|
center_x,
|
|
center_y,
|
|
center_x - borderwidth,
|
|
radStart,
|
|
radEnd,
|
|
false
|
|
);
|
|
context.strokeStyle = bordercolor;
|
|
context.stroke();
|
|
context.closePath();
|
|
context.restore();
|
|
|
|
// 第二个圆
|
|
context.save();
|
|
context.lineWidth = borderwidth;
|
|
context.beginPath();
|
|
context.arc(
|
|
center_x,
|
|
center_y,
|
|
center_x - lineWidth,
|
|
radStart,
|
|
radEnd,
|
|
false
|
|
);
|
|
context.strokeStyle = bordercolor;
|
|
context.stroke();
|
|
context.closePath();
|
|
context.restore();
|
|
}
|
|
|
|
// 绘制背景圆圈
|
|
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 - (borderwidth ? context.lineWidth / 2 : 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 + (title ? -titlefontsize / 2 - 1 : 0)
|
|
);
|
|
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 +
|
|
(title ? -titlefontsize / 2 - 5 : 0)
|
|
);
|
|
context.restore();
|
|
|
|
// 绘制数字下面的说明
|
|
if (title) {
|
|
context.save();
|
|
context.fillStyle = titlefontcolor;
|
|
context.font = titlefontsize + "px Helvetica";
|
|
var title_width = context.measureText(title).width;
|
|
context.fillText(
|
|
title,
|
|
center_x - title_width / 2,
|
|
center_y + titlefontsize / 2 + font_size / 2 + 1
|
|
);
|
|
context.restore();
|
|
}
|
|
}
|
|
|
|
// 绘制
|
|
function startDraw(speed) {
|
|
context.save();
|
|
context.clearRect(0, 0, width, height);
|
|
|
|
if (bordercolor) {
|
|
drawOuterBorderCircle();
|
|
}
|
|
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);
|
|
})();
|
|
}
|