javascript - 如何使用 requestAnimationFrame 循环播放多个方 block 的动画

标签 javascript canvas requestanimationframe

我正在使用 HTML Canvas 绘制多个正方形。我有 2 个函数:1)绘制一个正方形,2)在循环内绘制多个正方形。

现在我想使用 requestAnimationFrame 为这些方 block 设置动画,一次绘制一个。我怎样才能做到这一点。这是jsFiddle

var canvas = document.getElementById('canvas'),
       ctx = canvas.getContext('2d');

    function rect(x, y, w, h) {
      ctx.beginPath();
      ctx.rect(x, y, w, h);
      ctx.stroke();
    }

    function drawRect(number, size) {
      for (var i = 0; i <= number; i++) {
        rect(i * size, i * size, (i * size) * 2, (i * size) * 2);
      }
    }

    drawRect(10, 5);

最佳答案

我提供了一个帧限制器和补间来向您展示不同的动画方式。帧限制器具有示例中的步骤,补间具有在给定时间内完成所需的尽可能多的步骤。

var canvas = document.getElementById('canvas'),
  ctx = canvas.getContext('2d');

//requestAnim shim layer by Paul Irish
//http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
window.requestAnimFrame = (function() {
  return window.requestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame ||
    window.oRequestAnimationFrame ||
    window.msRequestAnimationFrame ||
    function( /* function */ callback, /* DOMElement */ element) {
      window.setTimeout(callback, 1000 / 60);
    };
})();

function rect(x, y, w, h, color) {
  ctx.beginPath();
  ctx.strokeStyle = color;
  ctx.rect(x, y, w, h);
  ctx.stroke();
}

function drawRect(i, size, color) {
  //for (var i = 0; i <= number; i++) {
  rect(i * size, i * size, (i * size) * 2, (i * size) * 2, color);
  //}
}

var i = 0;
var incr = 1;
var i_max = 10;
var size = 5;
var fps = 10;
var delay = 1000 / fps;
var lastFrame = 0;

var animationTime = 5000
var tweenStep = i_max / ((animationTime/1000) * 60);
var j = 0;

function animateRect() {

  // draw at 60fps
  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
  drawRect(i, size, "#0000FF");
  
  // This is a frame limiter.
  var currentFrame = Date.now();
  
  if ((currentFrame - lastFrame) >= delay) {
    i += incr;
    if (i >= i_max) i = i_max - 2, incr = -1;
    if (i < 0) i = 1, incr = 1;
    lastFrame = currentFrame;
  }
  
  // this is a tween. The step is calculated for the desired time.
  drawRect(j, size, "#FF0000");
  j += tweenStep;
  if (j >= i_max) tweenStep *= -1,j=i_max-1;
  if (j < 0) tweenStep *= -1, j=0;
  

  requestAnimFrame(animateRect);
  //draw rectangle one by one here...
}

animateRect();
//drawRect(10, 5);
<canvas id="canvas" width="600" height="600"></canvas>

关于javascript - 如何使用 requestAnimationFrame 循环播放多个方 block 的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35590348/

相关文章:

javascript - 强制 Google InfoWindow 重绘自身或刷新其内容

javascript - 需要帮助编写一个函数来使网格内的任何框都可以点击并填充色轮

jquery - 在 Firefox 23.0.1 上使用 Mac 触控板的 iScroll 4 中的滚动错误

javascript - 我什么时候需要调用 requestAnimationFrame()?

javascript - Ajax - 成功返回超过 1 个变量

javascript - 带转折点的 Canvas 螺旋上升效果

javascript - 处理 `keyup` 事件时出错

javascript - iOS 网页 View : Prompt an user to download image using only JavaScript

javascript - HTML5 Canvas 中的 textAlign 属性在 IE 11 中无法正常工作

javascript - 为基于网络的动画设置 FPS 基准?