{"id":201,"date":"2013-09-22T21:50:27","date_gmt":"2013-09-22T19:50:27","guid":{"rendered":"http:\/\/www.davel.fr\/techblog\/?p=201"},"modified":"2013-09-22T21:54:32","modified_gmt":"2013-09-22T19:54:32","slug":"plugin-jquery-imganimation","status":"publish","type":"post","link":"https:\/\/www.davel.fr\/techblog\/2013\/09\/plugin-jquery-imganimation\/","title":{"rendered":"Plugin jQuery : ImgAnimation"},"content":{"rendered":"<p>Bon, \u00e7a faisait longtemps que je n'avais pas \u00e9crit ici mais j'arrive avec un truc int\u00e9ressant - enfin j'esp\u00e8re : un nouveau plugin jQuery. (youhou, wahou, sons de cris et de foule en liesse, et non pas en laisse, m\u00eame si au fond \u00e7a pourrait \u00eatre bien marrant.)<\/p>\n<p><strong><em>En r\u00e9sum\u00e9<\/em><\/strong><\/p>\n<p><strong><a href=\"https:\/\/github.com\/davellx\/jQuery-ImgAnimation\">ImgAnimation <\/a><\/strong>est un plugin qui va permettre de mettre en place facilement une animation bas\u00e9e sur une suite de fichier images qui forment une animation, fa\u00e7on dessin anim\u00e9.<br \/>\n<!--more--><br \/>\nLe principe est que les images sont affich\u00e9es et cach\u00e9es selon le besoin.<br \/>\nPour cel\u00e0, il suffit de charger les images, de lancer le plugin sur un conteneur avec les images en param\u00e8tres et hop, on y est !<\/p>\n<p><em>Pourquoi pas en Canvas ?<\/em><br \/>\nParce que \u00e7a ne tourne pas sur les navigateurs &lt;IE9 et comme il m'arrive encore de bosser dessus malgr\u00e9 mes pleurs, mes cris et mes larmes, j'ai voulu d\u00e9velopper un truc compatible. (pour info je l'avais commenc\u00e9 en canvas \u00e0 la base mais <a href=\"http:\/\/www.createjs.com\/#!\/EaselJS\" title=\"EaselJS\">EaselJS<\/a> a d\u00e9j\u00e0 des outils pour faire un peu pareil)<\/p>\n<p><em>Pourquoi pas simplement une vid\u00e9o ?<\/em><br \/>\nParce que le seek fonctionne assez mal sur les tablettes et mobiles et peuvent prendre parfois quelques secondes pour arriver au bout. Pas pratique pour une animation fluide. :)<\/p>\n<p><em>Pourquoi ne pas charger les images directement dans le plugin ?<\/em><br \/>\nCe n'\u00e9tait pas le but et \u00e7a ne permet que peu de lancer \u00e7a dans un loader plus global. Mais mon exemple montre comment faire assez facilement.<\/p>\n<p><strong><em>Comment s'en servir ?<\/em><\/strong><\/p>\n<p>D\u00e9j\u00e0, voici <a href=\"http:\/\/davel.fr\/demo\/jQuery-ImgAnimation\/\" title=\"Exemple\">un exemple assez parlant<\/a> pour expliquer le fonctionnement global.<br \/>\nMais pour r\u00e9sumer : <\/p>\n<p>1\/ Il faut mettre en place la base : mettre les tags pour charger le Javascript (en n'oubliant pas jQuery bien sur!)<\/p>\n<p>2\/ Charger les images en tant qu'objets \u00e0 int\u00e9grer, pour cela j'utilise <a href=\"http:\/\/www.createjs.com\/#!\/PreloadJS\" title=\"PreloadJS\">PreloadJS<\/a> mais tout autre m\u00e9thode ira tr\u00e8s bien.<\/p>\n<p>3\/ Instancier le plugin sur un conteneur<\/p>\n<pre lang=\"html\" line=\"1\">\r\n<div id=\"imgAnimation\"><\/div>\r\n<\/pre>\n<pre lang=\"javascript\" line=\"1\">\r\n$('#imgAnimation').ImgAnimation(options);\r\n<\/pre>\n<p>Les options sont (\u00e0 l'heure actuelle) :<br \/>\n- <strong>loop <\/strong>: boolean \/\/ pour que l'animation reprenne depuis le d\u00e9but une fois arriv\u00e9 \u00e0 la derni\u00e8re frame (default : true)<br \/>\n- <strong>images <\/strong>: array \/\/ contient la liste des images(default : tableau vide mais je conseille quand m\u00eame de le remplir un peu :))<br \/>\n- <strong>labels <\/strong>: object \/\/ contient les noms de labels et la frame associ\u00e9e,ex {nomframe:numframe}, utile pour les fonctions gotoAndPlay et gotoAndStop (default : object vide)<br \/>\n- <strong>onAnimationEnterFrame <\/strong>\/\/ lanc\u00e9 \u00e0 chaque apparition d'une frame. (default : fonction vide)<br \/>\n- <strong>intervalTime <\/strong>\/\/ en millisecondes le d\u00e9lai entre l'apparition de deux frames \u00e0 la lecture. (default : 25)<\/p>\n<p>4\/ R\u00e9cup\u00e9rer l'objet data de l'animation pour en prendre le contr\u00f4le.<br \/>\nLe plugin a \u00e9t\u00e9 bas\u00e9 sur le <a href=\"http:\/\/stefangabos.ro\/jquery\/jquery-plugin-boilerplate-revisited\/\" title=\"jQuery plugin boilerplate\">jQuery Plugin Boilerplate de Stefan Gabos<\/a>, donc voil\u00e0 la m\u00e9thode pour r\u00e9cup\u00e9rer l'objet et utiliser les fonctions principales.<\/p>\n<pre lang=\"javascript\" line=\"1\">\r\nvar objAnim = $('#imgAnimation').data('ImgAnimation');\r\nobjAnim.play();\r\n<\/pre>\n<p>Voil\u00e0 les fonctions de contr\u00f4le de l'animation. Si vous \u00e9tiez (\u00eates?) familiers des MovieClips de Flash et de l'AS(2-3), \u00e7a ne vous changera pas beaucoup.<br \/>\n- animObject.play();<br \/>\n- animObject.stop();<br \/>\n- animObject.gotoAndStop(num or label);<br \/>\n- animObject.gotoAndPlay(num or label);<br \/>\n- animObject.nextFrame();<br \/>\n- animObject.prevFrame();<br \/>\n- animObject.playTo(num or label, callback function);<br \/>\n- animObject.destroy();<\/p>\n<p>Et comment disent les anglo-saxons : \"Et voil\u00e0 !\"<br \/>\nJe vous conseille vivement de regarder l'exemple car il regroupe pas mal de fonctionnements classiques.<\/p>\n<p>Ah, j'allais oublier, j'ai bien \u00e9videmment mis tout \u00e7a en place sur <a href=\"https:\/\/github.com\/davellx\/jQuery-ImgAnimation\" title=\"Repo GitHub\">un repo GitHub : jQuery-ImgAnimation<\/a>.<\/p>\n<p>Et sans vouloir faire mon youtubeur de base, dites-moi ce que vous en pensez, d'une part \u00e7e me ferait plaisir et d'autre part \u00e7a m'aiderait surement \u00e0 l'am\u00e9liorer (et moi par l\u00e0 m\u00eame).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bon, \u00e7a faisait longtemps que je n&rsquo;avais pas \u00e9crit ici mais j&rsquo;arrive avec un truc int\u00e9ressant &#8211; enfin j&rsquo;esp\u00e8re : un nouveau plugin jQuery. (youhou, wahou, sons de cris et de foule en liesse, et non pas en laisse, m\u00eame si au fond \u00e7a pourrait \u00eatre bien marrant.) En r\u00e9sum\u00e9 ImgAnimation est un plugin qui [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[],"class_list":["post-201","post","type-post","status-publish","format-standard","hentry","category-javascriptjquery"],"_links":{"self":[{"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/posts\/201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/comments?post=201"}],"version-history":[{"count":10,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/posts\/201\/revisions"}],"predecessor-version":[{"id":211,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/posts\/201\/revisions\/211"}],"wp:attachment":[{"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/media?parent=201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/categories?post=201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/tags?post=201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}