canvas实现圆环进度条

386 阅读3分钟

基础知识

  1. 屏幕尺寸问题:

参考链接:www.cnblogs.com/zaoa/p/8630…

  1. 浏览器坐标系

参考链接:blog.csdn.net/qq155683753…

注意:在canvas中绘制图形是在canvas坐标系中,canvas样式显示是另一个概念 canvas的width、height属性是设置的坐标系的宽高,style的width、height设置的是显示大小(逻辑像素)

圆环效果图

圆环进度条代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>canvas</title>
  <style>
  </style>
</head>

<body>
  <canvas id="canvas" width="500" height="500" style="background:#F7F7F7;">
    <p>you browser not support canvas!</p>
  </canvas>
  <script>
    let canvas = document.getElementById('canvas'), //获取canvas元素
      context = canvas.getContext('2d'), //获取画图环境,指明为2d
      centerX = canvas.width / 2, //Canvas中心点x轴坐标
      centerY = canvas.height / 2, //Canvas中心点y轴坐标
      r = 100, // 半径
      rad = Math.PI * 2 / 100, //将360度分成100份,那么每一份就是rad度
      colorArr = ['blue', 'yellow', 'red'], //渐变色
      speed = 0.1; //加载的快慢就靠它了


    //绘制变化外圈
    function LinearCircle(n) {
      let color = LinearGradient(n) // 获取颜色值
      context.save();
      context.beginPath();
      context.strokeStyle = color;
      context.lineWidth = 12;
      context.arc(centerX, centerY, r, -Math.PI / 2, -Math.PI / 2 + n * rad, false);
      context.stroke();
      context.restore();
    }

    //绘制外圈
    function whiteCircle() {
      context.save();
      context.beginPath();
      context.strokeStyle = "#A5DEF1";
      context.lineWidth = 12;
      context.arc(centerX, centerY, r, 0, Math.PI * 2, false);
      context.stroke();
      context.closePath();
      context.restore();
    }

    //百分比文字绘制
    function text(n) {
      context.save();
      context.fillStyle = "#F47C7C";
      context.font = "40px Arial";
      context.textAlign = "center";
      context.textBaseline = "middle";
      context.fillText(n.toFixed(0) + "%", centerX, centerY);
      context.restore();
    }
    /*
    * 设置渐变色
    */
    function LinearGradient(n) {
      let ga = -Math.PI / 2 + n * rad;
      // 找到圆环上的坐标
      let gd = [
        centerX + r * (1 - Math.cos(ga)), // x0
        centerY + r * (1 + Math.sin(ga)), // y0
        centerX + r * (1 + Math.cos(ga)), // x1
        centerY + r * (1 - Math.sin(ga))  // y1
      ];
      let lg = context.createLinearGradient.apply(context, gd);
      for (var i = 0; i < colorArr.length; i++) {
        var color = colorArr[i],
          pos = i / (colorArr.length - 1);
        lg.addColorStop(pos, color);
      }
      return lg;
    }

    //动画循环
    (function drawFrame() {
      window.requestAnimationFrame(drawFrame);
      context.clearRect(0, 0, canvas.width, canvas.height);
      whiteCircle();
      text(speed);
      LinearCircle(speed);
      if (speed > 100) speed = 0;
      speed += 0.1;
    }())
    
  </script>
</body>

</html>

圆弧效果图

圆弧代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>canvas</title>
  <style>
  </style>
</head>

<body>
  <canvas id="canvas" width="500" height="500" style="background:#F7F7F7;">
    <p>you browser not support canvas!</p>
  </canvas>
  <script>
    let canvas = document.getElementById('canvas'), //获取canvas元素
      context = canvas.getContext('2d'), //获取画图环境,指明为2d
      centerX = canvas.width / 2, //Canvas中心点x轴坐标
      centerY = canvas.height / 2, //Canvas中心点y轴坐标
      r = 100, // 半径
      rad = Math.PI / 100, //将360度分成100份,那么每一份就是rad度
      colorArr = ['blue', 'yellow', 'red'], //渐变色
      speed = 0.1, //加载的快慢就靠它了
      start = -Math.PI, //起始点
      end = 0; //结束点


    //绘制变化外圈
    function LinearCircle(n) {
      let color = LinearGradient(n) // 获取颜色值
      context.save();
      context.beginPath();
      context.strokeStyle = color;
      context.lineWidth = 12;
      context.arc(centerX, centerY, r,start, start + n * rad, false);
      context.stroke();
      context.restore();
    }

    //绘制外圈
    function whiteCircle() {
      context.save();
      context.beginPath();
      context.strokeStyle = "#A5DEF1";
      context.lineWidth = 12;
      context.arc(centerX, centerY, r, start, end, false);
      context.stroke();
      context.closePath();
      context.restore();
    }

    //百分比文字绘制
    function text(n) {
      context.save();
      context.fillStyle = "#F47C7C";
      context.font = "40px Arial";
      context.textAlign = "center";
      context.textBaseline = "middle";
      context.fillText(n.toFixed(0) + "%", centerX, centerY-25);
      context.restore();
    }
    /*
    * 设置渐变色
    */
    function LinearGradient(n) {
      let ga = start + n * rad;
      // 找到圆环上的坐标
      let gd = [
        centerX + r * (1 + Math.cos(ga)), // x1
        centerY + r * (1 - Math.sin(ga)),  // y1
        centerX + r * (1 - Math.cos(ga)), // x0
        centerY + r * (1 + Math.sin(ga)), // y0
        
      ];
      let lg = context.createLinearGradient.apply(context, gd);
      for (var i = 0; i < colorArr.length; i++) {
        var color = colorArr[i],
          pos = i / (colorArr.length - 1);
        lg.addColorStop(pos, color);
      }
      return lg;
    }

    //动画循环
    (function drawFrame() {
      window.requestAnimationFrame(drawFrame);
      context.clearRect(0, 0, canvas.width, canvas.height);
      whiteCircle();
      text(speed);
      LinearCircle(speed);
      if (speed > 100) speed = 0;
      speed += 0.1;
    }())
    
  </script>
</body>

</html>

注意:以上代码中context.save()、context.restore()必须要注意:它用来保存上下文的操作,否则会后面的会把前面的覆盖

后续持续更新canvas相关知识...