如何无限期地为 canvas FabricJs 上的同心圆制作动画
How to indenfinetly animate the concetric circles on a canvas FabricJs
我可以使用 FabricJs Canvas 为 canvas 上的同心圆设置动画。我可以制作一个无限动画,直到最后一个外圈,但是最后一个外圈仍然在 canvas 上,我的目标是重新启动从内圈到外圈的动画。
这是我试过的。
const canvas = new fabric.Canvas('gameCanvas', {
selection: false
});
fabric.Object.prototype.originX = fabric.Object.prototype.originY = 'center';
let circles = [];
document.addEventListener('DOMContentLoaded', function() {
drawCircles();
});
document.getElementById('animateBtn').addEventListener('click', function()
{
canvas.clear();
animateCircles();//This function will trigger the animation
});
function makeCircle(r)
{
return new fabric.Circle({
left: 300,
top: 120,
strokeWidth: 1.5,
radius: r,
fill: 'white',
stroke: 'black',
selectable: false,
hoverCursor: 'default',
hasControls: false,
hasBorders: false
});
}
//This function would draw 10 concentric circles on the canvas
function drawCircles()
{
for(let i = 9; i >= 0; i--)
{
let circle = makeCircle(10*(i + 1));
circles.push(circle);
canvas.add(circle);
}
}
function animateCircles()
{
canvas.clear();
function loop(i)
{
if (i < 0) return;
circles[i].animate({
opacity: 1
}, {
duration: 500, //the animation last 5 ms
easing: fabric.util.ease['easeInElastic'],
onChange: canvas.renderAll.bind(canvas),
onComplete: function () {
circles[i].setCoords();
canvas.add(circles[i]);
canvas.renderAll();
loop(i - 1);
}
});
}
loop(9);
setInterval(function()
{
canvas.clear();
loop(9);
}, 5000); //Repeat the animation every 5 seconds
}
#container {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
}
#animateBtn {
margin-bottom: .5em;
}
<div id="container">
<button id="animateBtn">Start Animation</button>
<canvas id="gameCanvas" width="600" height="240" style="border: 2px solid green;"></canvas>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.0.0/fabric.min.js"></script>
这是因为您每 5000 毫秒调用一次 setInterval()
,并且试图同时为第十个圆圈设置动画。 500ms * 10 = 5000ms
。所以当第十个圆圈开始动画时,你正在通过 setInterval()
调用循环函数
将召回时间更改为 5500 毫秒
setInterval(function () {
canvas.clear();
loop(9);
}, 5500); //Repeat the animation every 5 seconds
我可以使用 FabricJs Canvas 为 canvas 上的同心圆设置动画。我可以制作一个无限动画,直到最后一个外圈,但是最后一个外圈仍然在 canvas 上,我的目标是重新启动从内圈到外圈的动画。 这是我试过的。
const canvas = new fabric.Canvas('gameCanvas', {
selection: false
});
fabric.Object.prototype.originX = fabric.Object.prototype.originY = 'center';
let circles = [];
document.addEventListener('DOMContentLoaded', function() {
drawCircles();
});
document.getElementById('animateBtn').addEventListener('click', function()
{
canvas.clear();
animateCircles();//This function will trigger the animation
});
function makeCircle(r)
{
return new fabric.Circle({
left: 300,
top: 120,
strokeWidth: 1.5,
radius: r,
fill: 'white',
stroke: 'black',
selectable: false,
hoverCursor: 'default',
hasControls: false,
hasBorders: false
});
}
//This function would draw 10 concentric circles on the canvas
function drawCircles()
{
for(let i = 9; i >= 0; i--)
{
let circle = makeCircle(10*(i + 1));
circles.push(circle);
canvas.add(circle);
}
}
function animateCircles()
{
canvas.clear();
function loop(i)
{
if (i < 0) return;
circles[i].animate({
opacity: 1
}, {
duration: 500, //the animation last 5 ms
easing: fabric.util.ease['easeInElastic'],
onChange: canvas.renderAll.bind(canvas),
onComplete: function () {
circles[i].setCoords();
canvas.add(circles[i]);
canvas.renderAll();
loop(i - 1);
}
});
}
loop(9);
setInterval(function()
{
canvas.clear();
loop(9);
}, 5000); //Repeat the animation every 5 seconds
}
#container {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
}
#animateBtn {
margin-bottom: .5em;
}
<div id="container">
<button id="animateBtn">Start Animation</button>
<canvas id="gameCanvas" width="600" height="240" style="border: 2px solid green;"></canvas>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.0.0/fabric.min.js"></script>
这是因为您每 5000 毫秒调用一次 setInterval()
,并且试图同时为第十个圆圈设置动画。 500ms * 10 = 5000ms
。所以当第十个圆圈开始动画时,你正在通过 setInterval()
将召回时间更改为 5500 毫秒
setInterval(function () {
canvas.clear();
loop(9);
}, 5500); //Repeat the animation every 5 seconds