代码之家  ›  专栏  ›  技术社区  ›  jcubic

饼图画布动画在一帧上显示整圈

  •  0
  • jcubic  · 技术社区  · 6 年前

    我有类似于成长/收缩动画的饼图,但是在它的中间,有一个框架上显示了一个填充圆,我如何才能摆脱它?

    var canvas = document.querySelector('canvas');
    
    var ctx = canvas.getContext('2d');
    var increase = Math.PI * 2 / 100;
    var max = Math.PI * 2;
    var angle = 0;
    var start = false;  
    setInterval(function() {
      ctx.clearRect(0, 0, 32, 32);
      ctx.fillStyle = '#F00A0A';
      ctx.beginPath();
      if (start) {
        ctx.arc(16, 16, 12, angle, 0);
      } else {
        ctx.arc(16, 16, 12, 0, angle);
      }
      ctx.lineTo(16, 16);
      ctx.fill();
      angle += increase;
      if (angle >= max) {
        angle = 0;
        start = !start;
      }
    }, 20);
    <canvas width="32" height="32"/>

    我试过了:

      if (angle !== 0) {
        ctx.beginPath();
    
        if (start) {
          ctx.arc(16, 16, 12, angle, 0);
        } else {
          ctx.arc(16, 16, 12, 0, angle);
        }
        ctx.lineTo(16, 16);
        ctx.fill();
      }
    

    但这不起作用,当弧变边时,一帧显示全圆。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Emil S. Jørgensen    6 年前

    最简单的解决方法就是稍微偏移角度。

    这样,当您更改绘图模式时,圆不会“完成”:

    var canvas = document.body.appendChild(document.createElement('canvas'));
    var canvasSize = canvas.width = canvas.height = 100;
    var ctx = canvas.getContext('2d');
    ctx.fillStyle = '#F00A0A';
    var increase = Math.PI * 2 / 100;
    var max = Math.PI * 2;
    var angle = 0.0000001;
    var start = false;
    function update() {
        ctx.clearRect(0, 0, canvasSize, canvasSize);
        ctx.beginPath();
        ctx.arc(canvasSize / 2, canvasSize / 2, canvasSize / 3, angle, 0, start);
        ctx.lineTo(canvasSize / 2, canvasSize / 2);
        ctx.fill();
        angle += increase;
        if (angle >= max) {
            angle = angle % max;
            start = !start;
        }
        requestAnimationFrame(update);
    }
    update();