gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:18:43 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com