Estoy usando SVG para gráficos en una aplicación web AJAX. Cuando se reciben los datos iniciales, me gustaría animar los elementos del gráfico (como barras) desde los valores predeterminados de 0 hasta el nuevo valor de datos. Si el usuario selecciona un nuevo conjunto de datos, solicito nuevos datos del servidor y luego deseo animar la barra desde el valor anterior al nuevo.Cambia dinámicamente los valores de animación SVG al usar fill = "freeze"
<rect x="0" y="0" width="1px" height="20px" fill="red">
<animate id="anim" attributeName="width" attributeType="XML"
begin="indefinite" from="0" to="100px" dur="0.8s" fill="remove"/>
</rect>
se recibe Cada dato de tiempo, me puse la from
y to
atributos y llamar beginElement()
.
Si configuro fill="remove"
en la animación SVG, la barra se anima correctamente cada vez que se carga un nuevo conjunto de datos, pero, por supuesto, entre las animaciones, la barra vuelve a su ancho predeterminado.
Configuración width.baseVal.value
para establecer un nuevo valor base antes o después de llamar al beginElement()
provoca un parpadeo muy desagradable.
Así que traté de usar fill="freeze"
para que la barra mantenga su ancho al final de cada animación. El problema es que la primera animación funciona, pero cada llamada posterior a beginElement()
devuelve la barra a su ancho predeterminado de inmediato y la animación deja de funcionar.
Estoy probando en Chrome 12.0. Aquí hay una muestra para ver cómo se rompe la animación al usar el congelamiento.
<!DOCTYPE html>
<html>
<head><title>Test SVG animation</title></head>
<body>
<svg width="200px" height="20px" xmlns="http://www.w3.org/2000/svg" version="1.1">
<rect x="0" y="10px" width="200px" height="2px"/>
<rect x="0" y="0" width="1px" height="20px" fill="red">
<animate id="anim" attributeName="width" attributeType="XML" begin="indefinite" from="0" to="100px" dur="1.3s" fill="freeze"/>
</rect>
parent.anim = document.getElementById('anim');
</svg>
<br/>
<a href="javascript:anim.beginElement();">anim.beginElement();</a>
<br/>
<a href="javascript:anim.endElement();">anim.endElement();</a>
<br/>
<br/>
<a href="javascript:anim.setAttribute('to', '50px');">anim.setAttribute('to', '50px');</a>
<br/>
<a href="javascript:anim.setAttribute('to', '150px');">anim.setAttribute('to', '150px');</a>
<br/>
<br/>
<a href="javascript:anim.setAttribute('fill', 'remove');">anim.setAttribute('fill', 'remove');</a>
<br/>
<a href="javascript:anim.setAttribute('fill', 'freeze');">anim.setAttribute('fill', 'freeze');</a>
<br/>
</body>
</html>
¿Cómo puedo animar el ancho de una barra, haga que sea mantener el nuevo ancho, y luego animar repetidamente a nuevos valores a medida que llegan?
¿Encontró una solución para esto? Tengo un problema similar al continuar animando los cambios de color usando fill = freeze. – ssawchenko