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