Tutoriel SVG dynamique avec SMIL

De EduTech Wiki
Aller à la navigation Aller à la recherche

Cet article est une ébauche à compléter. Une ébauche est une entrée ayant un contenu (très) maigre et qui a donc besoin d'un auteur.

Introduction

Introduction à SVG dynamique

Objectifs:

  • Animations de type SMIL
  • Interactivité de type SMIL

Voir aussi:

Remerciements: J.J.Solari (le traducteur de la recommandation SVG1 du W3C en version française). J’ai "pompé" pas mal de ce texte.

Animation SVG

Le principe de l'animation et assez simple: Animer veut dire changer un attribut d’un élément SVG dans le temps

Il existe deux méthodes:

(1) Animation de type "XML/SMIL" avec des balises SVG spéciales de type [[SMIL]

  • Il faut installer un navigateur de la génération Firefox 4, IE9, Chrome 10 (en béta en hiver 2011), n'importe quelle version de Opéra, ou encore l'ancien plugin Adobe SVG Viewer.
  • on peut animer pratiquement chaque attribut avec les éléments d’animation SVG/SMIL (un peu comme en VRML/X3D.
  • L’animation SVG/SMIL étend celle de SMIL avec quelques extensions.

(2) Animation via le DOM de SVG avec un script

  • marche avec Firefox 1.5, Opera, et tous les navigateurs récents en 2011.
  • Chaque attribut et "style sheet setting" est accessible selon DOM1 & 2. En plus, il existe un jeu d’interfaces DOM additionnelles.
  • En gros, on écrit un petit programme ECMAScript (JavaScript) qui modifie les attributs d’éléments ou qui ajoute/enlève des éléments/attributs du DOM.

Voir: Tutoriel SVG dynamique avec DOM

Le principe du "time-based":

  • L’animation est "time-based" (vs. le "frame-based" de Flash): on indique le départ et la durée d’une animation
  • On peut animer des attributs de façon indépendante (animations en parallèle)
  • Une animation peut se déclencher suite à un geste de l’utilisateur (event) ou encore au temps voulu après le chargement du SVG.

Les balises pour l’animation SMIL"

Il existe 5 balises (éléments XML) pour l’animation.

L’élément ’animate’:

s’utilise pour animer un seul attribut, ou une seule propriété, au cours du temps.

L’élément ’set’:

offre un moyen simple pour le paramétrage de une seule valeur d’attribut pour une durée spécifiée.


L’élément ’animateMotion’:

entraîne le déplacement d’un élément le long d’un tracé de mouvement.


L’élément ’animateColor’:

spécifie une transformation de couleur au cours du temps.


L’élément ’animateTransform’:

anime un attribut de transformation sur un élément cible, permettant de ce fait aux animations de contrôler translation, changement d’échelle, rotation et/ou inclinaison.


Exemple 2-1: Exemple de sensibilisation avec animate

<svg xmlns="http://www.w3.org/2000/svg">


 <rect
 x="50" y="50" width="200" height="100"
  style="fill:#CCCCFF;stroke:#000099">
  <animate attributeName="x"
 attributeType="XML"
           begin="0s" dur="5s" from="50" to="300" fill="freeze"/
>
 </rect>
 <text x="55" y="90" style="stroke:#000099;fill:#000099;fontsize:24;">
  Hello. Let’s show a crawling rectangle ! </text>
</svg>


  • L’élément <animate /> est simplement placé à l’intérieur de l’élément
  • On anime la position horizontale ("x" du rect)
    • attributeName = "x" indique qu’on anime l’élément "x" du parent
    • begin = "0s" indique que l’animation commence après 0 secondes
    • dur="5s" indique que la durée est de 5 secondes
    • from="50" point de départ de X
    • to="300" point d’arrivé de X
    • fill="freeze" : l’animation gèle (c.a.d. le rectangle reste où il est)


2.3 Les attributs communs aux balises d’animation

  • Voici un petit résumé sans rentrer dans les détails
  • Utiliser à titre indicatif et ensuite regarder un manuel si nécessaire


xlink:href = "uri"

  • SVG utilise xlink pour designer le "animation target".
  • Il s’agit d’une référence d’URI vers l’élément qui est la cible de cette animation et dont un attribut sera donc modifié au moment voulu.
  • Dit plus simplement: On fait un lien vers l’attribut id de l’élément à animer
  • Note: on a pas toujours besoin de se référer à un id pour animer. Si on place des balises d’animation à l’intérieur d’un élément, on se réfère aux attributs de cet élément.
  • il faut déclarer le namespace "xlink" dans un élément parent

<svg width="8cm" height="3cm" xmlns="http://www.w3.org/2000/svg" >


attributeName: "nom"

  • indique le nom de l’attribut qu’il faut animer


attributType: "type"

  • indique le type d’attribut qu’il faut animer, exemple:

attributeType = "CSS | XML | auto"

Ci-dessous, on anime l’attribut "x" (la position x) d’un rectangle et c’est du type XML (SMIL):

<rect x="300">

<animate attributeName ="x" attributeType="XML"

begin="0s" dur="9s" fill="freeze" from="300" to="100" />

</rect>


begin : begin-value-list

  • définit quand l’élément devrait commencer (i.e. devenir actif).
  • "begin-value-list à une définition très compliquée, on peut définir des multiples débuts et fins selon les besoins de synchronisation (cf. la spécification)
  • Dans les cas simples on indique juste un début. L’exemple suivant dit "après 10 secondes" (voir ci-dessous pour d’autres "clock-value" simples:

<animate attributeName="x" attributeType="XML"

begin="10s" dur="9s" fill="freeze" from="300" to="100" />

  • Plus tard, on verra qu’on peut aussi utiliser un événement (ex. cliquer dessus) qui déclenche !


dur : Clock-value | "media" | "indefinite"

  • définit la durée de l’animation
  • Clock-value spécifie la longueur d’une durée de présentation. La valeur doit être supérieure à 0.
  • "indefinite" spécifie la durée simple comme indéfinie (c’est le défaut si vous ne précisez ni durée ni "média")
  • Typiquement on indique des seconds, par ex. 10s = 10 secondes

<animate attributeName="x" attributeType="XML"

begin="0s" dur="9s" fill="freeze" from="300" to="100" />


==

==

==

==

==

La définition de la valeur "clock-value" est compliquée:

Voici qqs. exemples qui marchent:

  • Valeurs d’horloge complètes :
02:30:03    = 2 heures, 30 minutes et 3 secondes
50:00:10.25 = 50 heures, 10 secondes et 250 millisecondes
  • Valeur d’horloge partielles :
02:33   = 2 minutes et 33 secondes
00:10.5 = 10.5 secondes = 10 secondes et 500 millisecondes
  • Les valeurs Timecount :
3.2h    = 3.2 heures = 3 heures et 12 minutes
45min   = 45 minutes
30s     = 30 secondes
5ms     = 5 millisecondes
12.467  = 12 secondes et 467 millisecondes


end : end-value-list

min : Clock-value | "media"

max : Clock-value | "media"

  • Ces trois attributs moins souvent utilisés peuvent contraindre la durée active
  • on peut indiquer une fin, un minimum ou encore un maximum de durée.
  • voir la spécification :)


restart : "always" | "whenNotActive" | "never"

  • always: L’animation peut être relancée à tout instant. C’est la valeur par défaut.
  • whenNotActive: L’animation ne peut être relancée que si elle n’est pas active


repeatCount : numeric value | "indefinite"

  • Spécifie le nombre d’itérations de la fonction d’animation. La valeur d’attribut peut être l’une des suivantes :
  • numeric value = valeur numérique « décimale » qui spécifie le nombre d’itérations.
  • "indefinite" = L’animation est définie comme se répétant indéfiniment (i.e. jusqu’à la fin du document).


repeatDur : Clock-value | "indefinite"

  • Spécifie la durée totale pour la répétition.
  • Clock-value = spécifie la durée
  • "indefinite" = l’animation est définie comme se répétant indéfiniment (i.e. jusqu’à la fin du document).


fill : "freeze" | "remove"

  • freeze = l’effet d’animation F(t) est défini pour geler la valeur d’effet à la dernière valeur de la durée active. L’effet d’animation est « gelé » pour le restant de la durée du document (ou jusqu’à ce que l’animation soit relancée)
  • remove = l’effet d’animation est stoppé (ne s’applique plus) quand la durée active de l’animation est terminée. (à moins que celle-ci ne soit relancée)


2.4 Les attributs pour les valeurs d’animation au cours du temps

  • Voici un petit résumé sans rentrer dans les détails, à utiliser à titre indicatif
  • Le principe de base de ce type de langage (comme dans VRML) est de laisser la possibilité à l’utilisateur d’indiquer simplement au moins 2 valeurs (début/fin) et de laisser la machine gérer le passage entre ces valeurs (interpolation)
  • Définition de la notion d’interpolation
    • En animation, calcul des images intermédiaires entre deux formes polynomiales ou encore entre 2 positions sur l’écran.
    • Pour la couleur, calcul des couleurs intermédiaires entre deux couleurs
    • Il existe ensuite plusieurs modes (cf. ci-dessus)


calcMode = "discrete | linear | paced | spline"

  • Spécifie le mode d’interpolation pour l’animation.
  • discrete = la fonction d’animation passera d’une valeur à l’autre sans aucune interpolation.
  • linear = une interpolation linéaire simple entre les valeurs est utilisée pour le calcul de la fonction d’animation. Sauf pour l’élément ’animateMotion’, c’est la valeur par défaut pour calcMode.
  • paced = interpolation qui produit une vitesse de transition égalisée au cours de l’animation.
  • spline = [selon la traduction française de la spécification SVG:] interpole à partir d’une valeur de la liste de l’attribut values sur la suivante, selon une fonction temporelle définie par une courbe (spline) de Bézier cubique. Les points de la spline sont définis dans l’attribut keyTimes et les points de contrôle pour chaque intervalle sont définis dans l’attribut keySplines.


values = "<liste>"

  • une liste d’une ou plusieurs valeurs, séparées par des points-virgules.


==

keyTimes = "<liste>"

  • Une liste de valeurs de temps, séparées par des points-virgules, utilisée pour le contrôle de la vitesse de défilement de l’animation. Chaque temps de la liste correspond à une valeur dans la liste de l’attribut values et définit quand la valeur est utilisée dans la fonction d’animation.
  • Chaque valeur de temps, dans la liste de l’attribut keyTimes, est spécifié en valeur décimale comprise entre 0 et 1 (inclus), représentant un décalage proportionnel dans la durée simple de l’élément d’animation.


keySplines = "<liste>"

  • Un jeu de points de contrôle de Bézier, associé avec la liste de l’attribut keyTimes, définissant une fonction de Bézier cubique qui contrôle l’allure du défilement des intervalles.


2.5 Les attributs qui contrôlent la succession des animations

additive = replace | sum

  • Cette balise est utilisée lorsqu’on effectue plus qu’une seule transformation en même temps.
  • sum = l’animation va s’ajouter à la valeur sous-jacente de l’attribut et des autres animations de faible priorité.
  • replace = l’animation va surclasser la valeur sous-jacente de l’attribut et des autres animations de faible priorité. C’est la valeur par défaut
  • Si une simple animation « agrandir » peut accroître la largeur d’un objet de 10 pixels ....
<rect width="20px" ...>
  <animate attributeName="width" from="0px" to="10px" dur="10s"
           additive="sum"/>
</rect>
  • ..., il est souvent pratique, pour des animations répétées, de se construire sur des résultats précédents, qui s’accumulent avec chaque itération. L’exemple suivant fait que le rectangle continue à grandir au fur et à mesure de la répétition de l’animation :
<rect width="20px" ...>
  <animate attributeName="width" from="0px" to="10px" dur="10s"
           additive="sum" accumulate="sum" repeatCount="5"/>
</rect>
  • À la fin de la première répétition, le rectangle a une largeur de 30 pixels, à la fin de la deuxième une largeur de 40 pixels et à la fin de la cinquième une largeur de 70 pixels.


accumulate = "none | sum"

  • C.f. la spécification


Exemple 2-2: Deltas d’une animation


<rect x="50" y="50" width="20px" height="20px"
  style="fill:yellow;stroke:black">
  <animate attributeName="width" dur="5s" repeatCount="5" 
           fill="freeze"
           from="0px" to="20px"
           additive="sum" accumulate="sum"/>
 </rect>


 <text x="55" y="90" style="stroke:#000099;fill:#000099;fontsize:24;">
  Hello. Let’s show a growing rectangle ! </text>


2.6 L’élément set

  • De la spécification: L'élément 'set' offre un moyen simple pour le paramétrage d’une seule valeur d'attribut pour une durée spécifiée. Il gère tous les types d'attributs, y compris ceux qui ne peuvent pas être raisonnablement interpolés, comme les chaînes et les valeurs booléennes.
  • L'élément 'set' n'est pas additif. Donc [svg-dyn.htm#27741 2.5 “Les attributs qui contrôlent la succession des animations” [14]] ne marchera pas.


Exemple 2-3: Simple animation avec set et animation

<rect x="50" y="50" width="200" height="100"               style="fill:#CCCCFF;stroke:#000099"
    visibility ="hidden"
 >
    <set
 attributeName="visibility"
 attributeType="XML"
      begin="4s" dur="5s" to="visible"/>
  </rect>


<rect style="fill:yellow;stroke:#000099" x="250" y="50" width="200" height="100" opacity="0" 
>
    <animate attributeName="opacity"
 attributeType="XML"
      begin="1s" dur="5s" from="0" to="1" fill="freeze"
/>
  </rect>


2.7 AnimateColor

Exemple 2-4: Animation d’une couleur

<svg height="900" width="900">



<rect style="fill:#000000;
" height="900" width="900" y="0" x="0">
  <animate fill="freeze" dur="5s" begin="0.1s"         to="#FFFFFF" from="#000000"
 calMode="linear" attributeName="fill
"/>
</rect>



<rect style="fill
 :#CC9933;stroke:#CC9933" width="20" height="500"
      ry="5" rx="5" y="100" x="400">
   <animate dur="5s" begin="1s" to="#000000"             from="#CC9933" calMode="linear" attributeName="fill
"/>
   <animate dur="5s" begin="6s" from="#000000"             to="#CC9933" calMode="linear" attributeName="fill
"/>
</rect>
  • Le principe est assez simple: on passe d’une couleur à une autre
  • Ici on a deux animations:
    • l’arrière-plan va de blanc à noir (from="#000000") à (to="#FFFFFF")
    • la tige va d’abord de from="#CC9933" à to="#000000" (après 1s et pendan 4sec)
      et ensuite de #000000" à "#CC9933".


2.8 AnimateTransform

Exemple 2-5: Simple rotation


  <title>Simple rotation example</title>
  <desc> Rotation with a grouping node </desc>
  <g>
    <rect x="50" y="50" rx="5" ry="5" width="200" height="100"
	  style="fill:#CCCCFF;stroke:#000099"/>
   <text x="55" y="90"                 style="stroke:#000099;fill:#000099;fontsize:24;">
	Hello. Let's rotate</text>
    <animateTransform attributeName="transform" type="rotate"
		      values="0 150 100; 360 150 100"
		      begin="0s" dur="5s" />
  </g>


  • Cette exemple moche fait une rotation
    • on anime l’attribut "rotate" du <g> (qui est au départ est à son défaut, c.à.d. sans rotation)
    • on doit indiquer juste le degré de rotation (0 au départ et 360 à la fin).


2.9 AnimateMotion

Exemple 2-6: Animation d’un mouvement le long d’un tracé

<path d="M-25,-12.5 L25,-12.5 L 0,-87.5 z"
        fill="yellow" stroke="red" stroke-width="7.06"  >


  <animateMotion dur="6s" repeatCount="indefinite"
                   path="M100,250 C 100,50 400,50 400,250"
 rotate="auto"
 />
</path>
  • Note: La définition du dessin du tracé suit exactement le même path

Svg-dyn-1.png

2.10 Animations combinées

  • Il est assez difficile de synchroniser un script compliqué, par contre faire des animations en parallèle est simple (il suffit de regarder les secondes ...)


Exemple 2-7: Exemple d’une animation combinée


3. Interactivité avec SVG

3.1 Principe et gestion des événements

  • L’interactivité et donc la gestion des événements ressemble au principe des GUI modernes (par exemple JavaScript) et elle est conforme à la spécification DOM2


Voici les types d’interactivité
  • Des actions initiées par l'utilisateur, telle que presser le bouton d'une souris, peuvent causer l'exécution d'animations (voir [svg-dyn.htm#37963 2. “Animation SVG” [5]]) ou de scripts ;
  • L'utilisateur peut initier des hyperliens vers de nouvelles pages Web par des actions (par ex. cliquer sur un élément)
  • L'utilisateur peut zoomer dans un contenu SVG ou effectuer un panoramique autour de celui-ci (dépend du client).
  • Les déplacements par l'utilisateur du dispositif de pointage peuvent modifier le curseur qui indique sa position


L’essentiel: SVG comprend
  • des attributs d'événements (ex. onclick="hello()" ) pour lancer des scripts
  • des noms d’ événements qu’on peut insérer dans certains attributs (ex: begin="click" ) et qui définissent l’élément d’animation à déclencher quand un événement donné survient.


3.2 Evénements de base SVG/SMIL

  • La spécification SVG1 définit plus de 20 événements
  • Les plus importants peuvent être capturés par des "attributs d’événements" qu’on insère dans les balises qu’on veut rendre interactives.
  • Il existe certains événements sans attributs qui concernent la modification de l’arbre DOM
  • En plus, à l'aide du Modèle Objet de Document (DOM) de SVG, un script peut enregistrer des guetteurs d'événements (event handlers) DOM2 de manière à ce qu'un script puisse être invoqué quand un événement donné survient .


Noms d’événement et attributs d’événement: petit résumé
  • le nom de l’événement sera utilisé pour identifier un event dans des balises d’animation (comme "begin").

<animateColor fill="freeze" dur="0.1s" to="blue" from="yellow"

attributeName="fill" begin="mouseover"/>

  • l’attribut d’événement permet de placer des "guetteurs d’événement" (event handlers) et qui pourront déclencher des scripts (voir [svg-dyn.htm#43431 4. “Interactivité avec le DOM et EcmaScript” [27]]

<circle onmouseover="circle_click(evt) " cx="300" cy="225" r="100" fill="red"/>

  • Donc attention : Ne confondez pas nom d’événement à utiliser dans les attributs des éléments d’animation et attributs d’événements pour lancer des scripts !!

"mouseover" pas égal à "onmouseover" (.... ou vous perdrez qq. heures ...)


La table suivante réunit la définition de quelques éléments et attributs associés

Nom de
l'événement

Description: un événement survient quand ...

Attribut
d'événement

focusin

un élément reçoit l'attention (le focus), par ex. l’élément 'text' devient sélectionné.

onfocusin

focusout

un élément perd l'attention, (désélection).

onfocusout

activate

un élément est activé, par exemple, au travers d'un clic de souris ou l'appui d'une touche.

  • Un argument numérique est fourni pour indiquer le type d'activation :
    1 pour une activation simple (par ex. simple clic ou la touche Entrée),
    2 pour une hyperactivation (par ex. un double-clic ou la combinaison de touches).

onactivate

click

le bouton du dispositif de pointage (souris, touchpad, stylo etc.) est cliqué au-dessus d'un élément.

  • Un clic est l'appui et le relâchement du bouton de la souris au-dessus d'une même position sur l'écran. (mousedown/mouseup sont avant/après).

onclick

mousedown

le bouton de pointage est pressé au-dessus d'un élément.

onmousedown

mouseup

le bouton de pointage est relâché au-dessus d'un élément.

onmouseup

mouseover

le dispositif de pointage est déplacé sur un élément.

onmouseover

mousemove

le dispositif de pointage est déplacé alors qu'il est au-dessus d'un élément..

onmousemove

mouseout

le dispositif de pointage (souris) est écarté de l’élément.

onmouseout

SVGLoad

le client a complètement interprété l'élément et ses descendants

  • il est prêt à agir de manière appropriée sur cet élément (affichage par exemple). Les ressources externes appelées requises doivent être chargées, interprétées et prêtes aussi.

onload

SVGUnload

le client enlève le document SVG (élément svg le plus externe)

onunload

SVGAbort

le chargement de la page est interrompu avant qu'un élément ait pu être complètement chargé.

onabort

SVGError

un élément ne se charge pas correctement ou quand une erreur survient lors de l'exécution d'un script.

onerror

SVGResize

une vue de document (svg le plus externe) est redimensionnée.

onresize

SVGScroll

une vue du document est glissée sur X, sur Y ou les deux.

onscroll

SVGZoom

le document change de niveau de zoom lors d'une interaction avec l'utilisateur. (éléments 'svg' les plus externes).

onzoom

beginEvent

un élément d'animation commence.

  • voir la description de l'interface TimeEvent dans la spéci.SMIL

onbegin

endEvent

un élément d'animation s'achève (voir TimeEvent)

onend

repeatEvent

un élément d'animation se répète.

  • Il est déclenché toutes les fois où l'élément se répète, après la première itération. (voir l'interface TimeEvent aussi)

onrepeat


Exemple 3-1: Simple animation avec un événement mouseover

  <a xlink:href="http://tecfa.unige.ch">
   <rect style="fill:#00FF00;stroke:#00FF00" width="200"          height="26" ry="5" rx="5" y="100" x="100"/>
  </a>


  • L’ellipse jaune qui contient un texte va activer une animation (changement de couleur) lorsqu’on glisse la souris dessus ou lorsqu’on la sort de nouveau (l’attribut "begin" va s’activer lorsqu’il y a un mouseover ou un mouseout).


<g transform="translate(100,100)">
    <ellipse stroke-width="2" stroke="black" fill="yellow" ry="1cm" rx="2cm"
             id="hint_button"
>
      <animateColor fill="freeze" dur="0.1s" to="blue" from="yellow"
                    attributeName="fill" begin="mouseover"/>
      <animateColor fill="freeze" dur="0.1s" to="yellow" from="blue"
                    attributeName="fill" begin="mouseout"/
>
    </ellipse>
    <text style="font-size:12;" alignment-baseline="middle" x="-1cm">Touch me !</text>
</g>


  • Ensuite, on a un contenu caché et qui s’affiche lorsque l'élément qui a l'id " hint_button " a un mouseover. Autrement dit: l'attribut "begin" d'une animation ne peut pas seulement être un temps, un événement de l'élément parent comme ci-dessus, mais également un événement qui a lieu dans un autre élément (l'ellipse dans notre cas anime la propriété style du cercle caché)!!


<g transform="translate(100,200)" style="display:none">


<circle style="fill:yellow;" r="2cm" cy="1cm" cx="1cm"/>
    <text style="font-size:12;" alignment-baseline="middle" x="-0.8cm" y="1cm">
    Find the scecret URL !</text>


    <animate fill="freeze" dur="0.1s" begin="hint_button.mouseover"
      from="none" to="block" attributeName="display"/>
    <animate fill="freeze" dur="0.1s" begin="hint_button.mouseout"
      from="block" to="none" attributeName="display"/>
</g>


Résumé
  • Des animations peuvent se déclencher suite à un geste d’utilisateur.
  • Le geste de l’utilisateur crée un événement géré (ici) par les balises "begin".
  • Autrement dit, le "begin" fait guetteur d’événement pour l’événement nommé.
  • Une animation d’un élément peut se déclencher suite à un événement qui a lieu dans un autre élément (on bouge la souris sur l’ellipse et c’est le cercle qui apparaît)