simpleAnimationCanvas = {
const width = 1200
const height = 500
const ctx = DOM.context2d(width, height);
const numCircles = 300
const palette1 = utils.random.pick(palettes)
const palette2 = utils.random.pick(palettes)
const dataStart = _.range(0, numCircles).map(i => ({
id: i,
x: Math.random()*width,
y: Math.random()*height,
r: Math.random()*20,
fill: utils.random.pick(palette1)
}))
const dataEnd = _.range(0, numCircles).map(i => ({
id: i,
x: Math.random()*width,
y: Math.random()*height,
r: Math.abs(utils.random.gaussian(20, 5)),
fill: utils.random.pick(palette2)
}))
const draw = (data) => {
ctx.fillStyle = "black"
ctx.fillRect(0, 0, width, height);
for (const { x, y, r, fill } of data) {
ctx.beginPath()
ctx.arc(x, y, r, 0, 2*Math.PI)
ctx.fillStyle = fill
ctx.fill()
}
}
const tl = gsap.to(dataStart, {
x: (index) => dataEnd[index].x,
y: (index) => dataEnd[index].y,
r: (index) => dataEnd[index].r,
fill: (index) => dataEnd[index].fill,
duration: 3,
ease: 'bounce',
onUpdate: () => draw(dataStart)
})
tl.pause()
const play = document.querySelector("#play-test");
const pause = document.querySelector("#pause-test");
const restart = document.querySelector("#restart-test");
const reverse = document.querySelector("#reverse-test");
play.onclick = () => tl.play();
restart.onclick = () => tl.restart()
pause.onclick = () => tl.pause();
reverse.onclick = () => tl.reverse();
draw(dataStart)
yield ctx.canvas;
}