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); | ||
|  |   })(); | ||
|  | } |