231 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			231 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.font = unitfontsize + "px Helvetica"; | ||
|  |     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); | ||
|  |   })(); | ||
|  | } |