У Рафаэля есть встроенный метод animateAlong
(http://raphaeljs.com/reference.html#animateAlong). Определите ваш путь, а затем используйте вспомогательный объект, перемещающийся по пути.
Затем, используя метод onAnimation
(http://raphaeljs.com/reference.html#onAnimation).Этот метод вызывает функцию на каждом этапе анимации, и вы можете определить функцию обратного вызова, чтобы нарисовать часть кривой, которую достиг вспомогательный объект (с помощью метода getSubpath
).
var p = r.path("M10,50c0,50,80-50,80,0c0,50-80-50-80,0z"),
t = 4000, // length of timeout
i = p.getTotalLength()/4000, // length of path to move each time
j = 0, // counter
p2 = r.path(),
e = r.ellipse(10, 50, 1,1).attr({stroke: "none", fill: "#f00"}).onAnimation(function () {
p2.attr({path: p.getSubpath(0, j*i)});
j++;
}).animateAlong(p, t, function() {
console.log(j);
});
});
Iзнаю, что это немного сложнее, но по сути вы выясняете, как далеко вдоль пути объект-помощник проходит каждый шаг пути (i
), а затем, когда счетчик зацикливается (j
), вы перемещаете другую дробь вдоль пути.
Я не уверен, что Рафаэль будет перерисовывать каждую миллисекунду, но должен быть способ выяснить, сколько этапов в анимации. animateAlong
имеет функцию обратного вызова, которую я использовал для регистрации j
после завершения анимации, чтобы вы могли точно видеть, сколько существует этапов анимации.