El formato SVG permite dos tipos de interactividad, que explicadas un poco por encima serían estas dos:
- Mediante guiones (scripts): en este caso se meten guiones en el fichero SVG (o en un fichero a parte, que luego se enlazan al fichero SVG). Esos guiones permiten interactuar con los elementos del fichero SVG. Por ejemplo, se puede conseguir que al pulsar un botón cambie el color de un elemento, o bien su posición, o bien cambie el texto de un elemento de texto. Este sistema también permite añadir elementos nuevos al fichero SVG que no estaban definidos inicialmente (por ejemplo, cada vez que se hace clic en un cuadrado aparece un círculo nuevo en pantalla en una posición diferente). Unos ejemplos:
svgDocument.getElementById('holamundo').firstChild.data = "¡Hola mundo!"; svgDocument.getElementById('panel_epicicloides').setAttributeNS(null, "visibility", "visible" ); svgDocument.getElementById('laser').setAttributeNS(null, "points", puntos );
El primer ejemplo modifica un texto (sustituye su contenido por ¡Hola mundo!). El segundo hace aparecer un grupo (llamado panel_epicicloides), ese grupo contiene varias figuras que actuan como un diálogo. Lo que hace, es modificar su propiedad de visibilidad (visibility) activándola. El último caso, modifica la trayectoria de una polilinea (llamada laser) y hace que tenga los puntos que se metieron antes en la variable de texto puntos. Se modifica la propiedad points. - Mediante animaciones SMIL: en este caso no se usan guiones, sino más etiquetas SVG donde se indican las acciones. Estas etiquetas no tienen tanta potencia como los guiones (scripts), pero facilitan mucho la creacción de algunos efectos interactivos, como el cambio de color de un elemento mientras se pasa el ratón por encima. Una pega de este sistema es que Firefox 3 no está adaptado (el fichero SVG es mostrado sin estos efectos), aunque no creo que tarden en incluir esta mejora.
Hay dos tipos de etiquetas: set y animate. Set permite aplicar un atributo de forma directa, sin una transición intermedia (ejemplo: un rectángulo rojo, inmediatamente se pone en verde). En cambio animate permite producir una transición con una duración, y permite establecer varios pasos intermedios y una interpolación de los valores intermedios. Por ejemplo, se puede tener el rectángulo rojo de antes, pero al ponerse en verde pasa por el color morado, el azul y finalmente el verde, durante una transición de colores de tres segundos de duración. En ambos casos, hay que indicar un evento donde se inicia el cambio, un atributo y el valor para el atributo.
Unos ejemplos (clic para ampliar):En las dos primeras lineas se usa set. Son entradas alternativas, la primera se activa cuando el ratón entra dentro del grupo g_hola_mundo, y la segunda cuando sale. El atributo que modifican es el relleno (fill) y dan el color indicado en to. Su funcionamiento permite realizar un cambio de color cuando se pasa el ratón encima del grupo g_hola_mundo (que vendría a actuar a modo de botón).
En la tercera linea hay una animación donde se modifica el color a través de una transición de varios colores que dura un segundo.
El funcionamiento es sencillo: inicialmente solo aparece el botón "clic". Al pulsar el botón aparece ¡Hola mundo!. Mientras, el botón toma un color verdoso al pasar el ratón por encima (en Firefox 3 no se aprecia esto último).En el se puede destacar varios detalles:
- La cabecera del SVG es diferente del hola mundo de la entrada del blog anterior, ya que en esa no funcionaban las animaciones. Esa cabecera nueva la copié del primer enlace de las fuentes (apike.ca), y también copié la primera función del script. Si programando te encuentras que el fichero SVG parece tonto y no hace nada, puede ser dos cosas, que te hayas equivocado en el script (una coma mal puesta puede detener su ejecución), o que la cabecera esté mal indicada.
- Hay un grupo (llamado g_hola_mundo) que agrupa un rectángulo (r_hola_mundo) y un texto (clic). Este grupo lo señalo en verde y tiene asignado que cuando se pulse el ratón sobre el se llame la función "hola mundo" del guión. Esta función se asigna sobre el grupo y no sobre el rectángulo, porque si se asignara sobre el rectángulo solo funcionaría en el área que se ve del rectángulo, es decir, si se hace clic justo sobre las letras del texto no haría nada. En cambio, si se asigna la función sobre el grupo entero (texto y rectángulo), funciona en todo el área.
Digamos que este grupo sería a efectos prácticos... un botón como los de cualquier cuadro de diálogo. - Un guión con una función (hola_mundo) que se activa al hacer clic en el grupo "g_hola_mundo". Esta función modifica el texto del elemento de texto "holamundo" (la última entrada del fichero SVG), sustituyendo el espacio que tenía originalmente por el texto ¡Hola mundo!
- Dos etiquetas para animar el color de fondo del rectángulo que forma el botón para activar el hola mundo. La primera asigna un color más verdoso al fondo cuando el ratón pasa por encima del grupo. La segunda asigna el color original cuando el ratón sale de esta zona. El evento es al meter el ratón dentro del grupo, porque si se hiciera en función del rectángulo solo habría un problema: al pasar el ratón por encima de las letras del texto se interpretaría de la misma forma que sacar el ratón del rectángulo, y fallaría.
- El rectángulo aparece en dos etiquetas en vez de una sola. Esto se hace cuando hay que añadir propiedades de animación al rectángulo.
La primera linea (sombreada en amarillo) sería para definir un rectángulo que no va a tener animación ni nada. Es una sola etiqueta y tiene la barra para indicar el final (/) que se pone en las etiquetas de cierre.
Las otras lineas (sombreadas en verde) también definen un rectángulo, pero entre medias se pueden introducir etiquetas para definir animación. Es muy importante destacar que la barra inclinada (/) solo aparece en la segunda etiqueta, la de cierre y nunca en la primera.
El resto de elementos (círculos, lineas, polilineas...) funcionan de forma parecida. Normalmente se definen usando una sola etiqueta, pero si se quiere añadir animaciones, hay que usar dos y poner las etiquetas para definir las animaciones entre medias.
Fuentes:
- http://apike.ca/prog_svg_smil.html
- http://rendergraf.wordpress.com/2008/09/12/animacion-svg-%E2%80%93-llega-la-alternativa-a-flash-pero-con-un-estandar-libre/



