When we post animated images to Facebook, it is displayed as Sprite Animation. We can also try using React Hooks to do it.
The image may look like this:
To do animation, we could write a custom React Hook useBackgroundShift()
:
function useBackgroundShift(size, xacross, yacross, xymax) { const [shift, setShift] = useState({ dx: 0, dy: 0 }); useEffect(() => { let intervalID; if (size.width !== null && size.height !== null) { intervalID = setInterval(() => { setShift(({ dx, dy }) => { if (dx + dy * yacross + 1 >= xymax) { dx = 0; dy = 0; } else if (++dx >= xacross) { dx = 0; if (++dy >= yacross) { dy = 0; } } return { dx, dy }; }); }, 132); } return () => intervalID && clearInterval(intervalID); }, [size.width, size.height, xacross, yacross, xymax]); if (size.width === null || size.height === null) return {}; return { backgroundPosition: `-${(shift.dx * size.width) / xacross}px -${ (shift.dy * size.height) / yacross }px`, backgroundRepeat: "no-repeat" }; }
I also added the ability to animate from frame 1 to frame N, just to see how it works. It is not yet perfect as I only did it as an experiment. Some might be hard coded numbers for the moment, but that's the basic idea of a custom React Hooks to do Sprite Animation.
Demo: https://codesandbox.io/s/beautiful-leaf-o9hew?file=/src/App.js
Top comments (0)