Building a data-driven image carousel with Sencha Touch 2
This evening I embarked on a little stellar voyage that I'd like to share with you all. Most people
OS X has a pretty little screensaver which takes a bunch of images and 'drops' them, spinning, onto the screen. Think of it like scattering photographs onto a table, one at a time.
Naturally, there's a desperate need for a JavaScript/Canvas port of this functionality, resulting in the following:
I had to limit the video capture framerate a bit so the video makes it look less smooth than it actually is. Check it out running in your own browser here.
For obvious reasons I have called the code behind this Bean, and it's all available up on Github.
For the curious, here's a little explanation about how it works. Bean starts off with a blank canvas and a list of image urls, which it preloads before getting started. It then drops one image at a time, rotating it as it goes. Each falling image is called a Plunger, because it plunges.
Each Plunger gets a random position and rotation to end up in, and takes care of drawing itself to the canvas on each frame by calculating its current size and rotation as it falls away from you.
Drawing each Plunger image on every frame quickly starts to kill the CPU, so we take a frame snapshot every time a Plunger has finished its descent. This just entails drawing the completed Plunges first and then using Canvas' getImageData API to grab the pixel data for the image.
This gives us a snapshot of all of the fallen Plungers, meaning we can just draw a single background image and the currently falling Plunger on each frame. This approach ensures the performance remains constant, as we are only ever drawing a maximum of 2 images per frame. Each time a Plunger finishes its descent a new snapshot is taken.
Bean attempts to draw a new frame roughly 25 times per second and modern browsers seem to handle this pretty well. Safari pulls around 60% of one core on my MacBook Pro, with Firefox somewhat less performant. Needless to say, I didn't even bother trying to make this work with IE.
Here's the code to set the Bean in motion. This is using a few bundled APOD images:
If you enjoyed emulating the OSX screensaver with Canvas, you might find creating a data-driven image carousel with Sencha Touch 2 intriguing, as it similarly showcases beautiful images in a seamless format. Additionally, exploring how ExtJS Solitaire utilizes JavaScript for a fun project can offer inspiration for more complex interactions using the ExtJS library.
This evening I embarked on a little stellar voyage that I'd like to share with you all. Most people
I have an article on Behaviour Driven Development for JavaScript in June's edition of the excellent