Comment animer un chemin vectoriel comme s'il était en train d'être dessiné, progressivement ? En d'autres termes, montrer lentement le chemin pixel par pixel.
J'utilise Raphaël.js
, mais si votre réponse n'est pas spécifique à une bibliothèque - comme s'il existait un modèle de programmation général pour faire ce genre de choses (je suis assez novice en matière d'animation vectorielle) - elle est la bienvenue !
C'est facile à faire avec des chemins droits, aussi simple qu'un exemple sur cette page : :
path("M114 253").animate({path: "M114 253 L 234 253"});
Mais essayez de changer le code sur cette page, disons, de cette façon : :
path("M114 26").animate({path: "M114 26 C 24 23 234 253 234 253"});
Et vous verrez ce que je veux dire. Le chemin est certes animé depuis son état initial (point "M114 26") jusqu'à son état final (courbe "C 24 23 234 253 234 253" partant du point "M114 26"), mais pas d'une manière spécifiée dans la question, pas comme s'il était dessiné.
Je ne vois pas comment animateAlong
peut le faire. Il peut animer un objet le long d'un chemin, mais comment faire pour que ce chemin s'affiche progressivement pendant que l'objet est animé le long de celui-ci ?
La solution ?
(Via La réponse de peteorpeter .)
Il semble qu'actuellement, la meilleure façon de le faire est d'utiliser de "faux" tirets en utilisant le SVG brut. Pour l'explication, voir cette démo o ce document page 4.
Comment produire un dessin progressif ?
Nous devons utiliser
stroke-dasharray
ystroke-dashoffset
et connaître la longueur de la courbe à dessiner. Ce code ne dessine rien à l'écran pour un cercle, une ellipse, une polyligne, un polygone ou un chemin :<[element] style="stroke-dasharray:[curve_length],[curve_length]; stroke-dashoffset:[curve_length]"/>
Si dans l'élément animate stroke-dashoffset on diminue à 0, on obtient un dessin progressif de la courbe.
<circle cx="200" cy="200" r="115" style="fill:none; stroke:blue; stroke-dasharray:723,723; stroke-dashoffset:723"> <animate begin="0" attributeName="stroke-dashoffset" from="723" to="0" dur="5s" fill="freeze"/> </circle>
Si vous connaissez une meilleure méthode, veuillez laisser une réponse.
Mise à jour (26 avr. 2012) : J'ai trouvé un exemple qui illustre bien l'idée, voir Courbes de Bézier animées .