javascript - HTML Canvas 在调整大小后更新次数过多

标签 javascript html canvas

我有一个 Canvas ,可以在其中制作动画。我监听窗口调整大小事件,更新 Canvas 大小并再次开始递归绘图。但旧的 draw() 调用似乎仍在继续,这导致动画比预期的速度更快。 这是代码:

HTML

<canvas id="myCanvas" width="1000" height="1000"></canvas>

CSS

* {
  margin: 0;
  padding: 0;
}

html,
body {
  width: 100%;
  height: 100%;
}

canvas {
  display: block;
}

JavaScript

var canvas = document.getElementById("myCanvas");
var context = canvas.getContext('2d');
var frameCount = 0;
var count = 0;

var rectDistance = 100;
var rectSize = 72;
var rectOffset = (rectDistance - rectSize) / 2;
var angleSpeed = 1;

var draw = function() {
  count++;

  var xCount = canvas.width / rectDistance;
  var yCount = canvas.height / rectDistance;

  context.fillStyle = "rgba(255,255,255,1)";
  context.fillRect(0, 0, canvas.width, canvas.height);

  for (var i = 0; i < xCount; i++) {
    for (var j = 0; j < yCount; j++) {

      context.save();

      var r = Math.round(i / xCount * 255);
      var g = Math.round(j / xCount * 255);

      xPos = i * rectDistance + rectOffset + Math.sin(j + frameCount / 20) * 10;
      yPos = j * rectDistance + rectOffset + Math.cos(i + frameCount / 20) * 10;

      context.translate(xPos + rectSize / 2, yPos + rectSize / 2);
      context.rotate(frameCount / 100 * angleSpeed * Math.sin(frameCount / 500) * 5);

      context.fillStyle = "rgba(" + r + "," + g + ",0,1)";
      context.fillRect(-rectSize / 2, -rectSize / 2, rectSize, rectSize);
      context.restore();
    }
  }

  frameCount = frameCount + 1;
  requestAnimationFrame(draw);
};

window.addEventListener('resize', function() {
  setTimeout(function() {
    resizeCanvas();
  }, 500);
}, false);

function resizeCanvas() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  draw();
}

// count the calls of draw() per second -> it's increasing on window.resize
function drawCalls() {
  setTimeout(function() {
    console.log("draw() called " + count + " times");
    count = 0;
    drawCalls();
  }, 1000)
}
drawCalls();

// start the loop
resizeCanvas();

如何防止旧的draw()调用在调整大小时继续递归执行?

这是一个具有相同问题的代码笔:http://codepen.io/Sebkasanzew/pen/GZGZVP

最佳答案

您忘记取消setTimeout() - 我建议如下:

var timer;

window.addEventListener('resize', function() {
  cancelAnimationFrame(timer);                  // cancel previous request
  timer = requestAnimationFrame(function() {    // create a new request
    resizeCanvas();
  })
});

关于javascript - HTML Canvas 在调整大小后更新次数过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36718457/

相关文章:

javascript - React bootstrap NavBar 未编译

javascript - 获取 child 中的 onClick 按钮事件

jquery - 是否可以调整粘在左侧的 div 的宽度以始终覆盖始终居中的 div?

JavaScript 将图像数据放在 Canvas 上

jquery - 带有背景图案和透明底部箭头的 DIV。如何?

javascript - 何时使用过渡与过渡组

javascript - 刷新网站时的暗模式延迟

html、正文和 div 设置为 100% 宽度,但它仍然没有占用全部 100%

javascript - 冒着听起来愚蠢的风险 : I want to make an HTML audio player that uses <canvas> for interaction. 想法?

JavaScript Canvas 在错误的坐标处绘制