Adam Smith has a very nice canvas-based image gallery written in Dart (may take a while to load) up on the githubs. I am still undecided about including SVG / canvas stuff in Dart for Hipsters, but I do think a chapter on animation is in order. I have already experimented with simple animations in Dart, this seems like a good chance to do something a little more interesting.
I start with a list of images:
var images = """ 01-4_failures_to_go.png 01-add_comix_form.png 01-add_from_event.png 01-anumation.png 01-asdf_comic.png 01-back_to_funky.png 01-calendar_full_o_appointments.png // ... 01-whoopsies.png 01-working_in_firefox.png """;In my main entry point, I split that string list into an array and create a queue:
main() { var q = new Queue.from(images.split("\n")); showNext(q); }The
showNext()
function can then pop the first element off the stack, wait for a period of time, and then repeat:showNext(queue, [last_el]) { if (last_el != null) { last_el.remove(); } var el = new Element.html("""<img src="images/${queue.removeFirst()}"/>"""); document.query('#gallery').nodes.add(el); if (!queue.isEmpty()) { window.setTimeout(() {showNext(queue, last_el: el);}, 1500); } }And that is enough to get started:
Update: I had a heck of a time getting an animation transition working with this. I factored adding and removing the element out into functions that add/remove with animation:
showNext(queue, [last_el]) { removeEl(last_el); var el = new Element.html("""<img src="images/${queue.removeFirst()}"/>"""); addEl(el); if (!queue.isEmpty()) { window.setTimeout(() {showNext(queue, last_el: el);}, 5*1000); } }The remove effect worked fine:
removeEl(el) { if (el == null) return; el.style.transition = 'opacity 1s ease-in-out'; el.style.opacity = "0"; window.setTimeout(() {el.remove();}, 1000); }I am just doing a simple "ease-in-out" (start and end slow) animation. The problem is the
addEl()
animation:addEl(el) { el.style.position = 'absolute'; el.style.opacity = "0"; document.query('#gallery').nodes.add(el); el.style.transition = 'opacity 1s ease-in'; el.style.opacity = "1"; }The problem? There is no animation. Instead the element displays immediately. Since it is the newly added element, it immediately covers up the old element. After way too much fiddling, I find that a timeout, even of only a couple of milliseconds allows the transition to work:
addEl(el) { el.style.position = 'absolute'; el.style.opacity = "0"; document.query('#gallery').nodes.add(el); window.setTimeout(() { el.style.transition = 'opacity 1s ease-in'; el.style.opacity = "1"; }, 2); }I lack a good explanation for this. Perhaps it has something to do with adding nodes, but setting the style on elements.
Day #298
Wow this image gallery is great! I need to update mine to be a bit more dynamic and friendly. Maybe something with some NoSQL store. Prob thinking of using the http.dart to run a dart http server and then have it communicate with couchdb but for storing images. The server side shouldn't be to hard to piece together http://goo.gl/vDpSH
ReplyDeleteOoh! I'll be eager to see how that works. I don't anticipate playing much with server side Dart, but maybe I will if your stuff goes well :D
Delete