Animação em Canvas - JavaScript
A combinação de desenhar várias formas no canvas com o uso da função requestAnimationFrame()
A animação, por si só, implica na mudança sequencial de quadros, onde cada quadro precisa ser desenhado manualmente. De modo geral, para criar uma animação, você deve seguir os seguintes passos:
Limpar a área de desenho.
Opcionalmente, salvar o estado atual.
Desenhar o quadro individual.
Opcionalmente, restaurar o estado salvo.
Esses passos geralmente são encapsulados em uma função, que é chamada em intervalos regulares (para cada quadro da animação). Para executar essa função, usa-se o método requestAnimationFrame()
Por exemplo, considere a seguinte página:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Exemplo de Canvas</title>
</head>
<body>
<canvas
id="canvas"
width="400"
height="250"
style="background-color: #eee; border-color: #ccc"
></canvas>
<script>
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
let x = 0;
let step = 1;
function draw() {
context.clearRect(0, 0, 400, 250); // limpar a área de desenho
console.log(x);
context.fillStyle = 'red';
context.fillRect(x, 10, 40, 40); // desenhar o retângulo
if (x >= 360) step = -1;
if (x <= 0) step = 1;
x += step;
window.requestAnimationFrame(draw);
}
draw();
</script>
</body>
</html>
Aqui, a função draw()
requestAnimationFrame
draw
draw()
De maneira similar, é possível animar composições inteiras de formas:
const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");
function draw() {
context.clearRect(0,0,500,300); // limpar a área de desenho
const time = new Date();
// ângulo para a rotação dos retângulos
const angle = ((2*Math.PI)/6)*time.getSeconds() + ((2*Math.PI)/6000)*time.getMilliseconds();
context.fillStyle = "red";
context.save();
context.translate(150,150);
context.rotate(angle);
context.translate(0,25);
context.fillRect(5,5,20,20); // retângulo vermelho
context.restore();
context.fillStyle = "yellow";
context.save();
context.translate(150,150);
context.rotate(angle);
context.translate(0,50);
context.fillRect(5,5,20,20); // retângulo amarelo
context.restore();
context.fillStyle = "green";
context.save();
context.translate(150,150);
context.rotate(angle);
context.translate(0,75);
context.fillRect(5,5,20,20); // retângulo verde
context.restore();
window.requestAnimationFrame(draw);
}
draw();
Neste exemplo, vários retângulos coloridos são desenhados em diferentes posições e ângulos, criando uma animação onde as formas parecem girar em torno de um ponto central. A função requestAnimationFrame()
draw()