SVG анимация по пути с Рафаэлем
у меня довольно интересная проблема с анимацией SVG.
Я анимирую по круговому пути, используя Raphael
obj = canvas.circle(x, y, size);
path = canvas.circlePath(x, y, radius);
path = canvas.path(path); //generate path from path value string
obj.animateAlong(path, rate, false);
метод circlePath-это тот, который я создал сам, чтобы создать путь круга в обозначении пути SVG:
Raphael.fn.circlePath = function(x , y, r) {
var s = "M" + x + "," + (y-r) + "A"+r+","+r+",0,1,1,"+(x-0.1)+","+(y-r)+" z";
return s;
}
пока все хорошо - все работает. У меня есть мой объект (obj), анимирующий по круговому пути.
но:
анимация работает только в том случае, если я создаю объект в тех же координатах X, Y, что и сам путь.
Если я запускаю анимацию из любых других координат (скажем, на полпути по пути), объект анимируется в круге правильного радиуса,однако он запускает анимацию из координат объекта X, Y, а не вдоль пути, как он отображается визуально.
В идеале я хотел бы иметь возможность остановить / запустить анимацию - та же проблема возникает при перезапуске. Когда я останавливаюсь, затем перезапускаю анимацию, она анимируется по кругу, начиная с остановленного X, Y.
обновление
Я создал страницу, которая демонстрирует проблему: http://infinity.heroku.com/star_systems/48eff2552eeec9fe56cb9420a2e0fc9a1d3d73fb/demo
Нажмите кнопку "Пуск", чтобы запустить анимацию. Когда вы останавливаете и повторно запускаете анимацию, она продолжается из текущих координат круга в круге правильных размеров.
1 ответов
тем не менее, ваш вариант использования является действительным и может потребовать другой функции-какой-то "паузы". Конечно, погрузка этого в багажник займет больше времени, чем вы хотите ждать.
С Рафаил исходный код, вот что происходит, когда вы зовете "стоп".
Element[proto].stop = function () {
animationElements[this.id] && animationElements[length]--;
delete animationElements[this.id];
return this;
};
Это уменьшает общее количество анимаций, и удаление анимации из списка. Вот как может выглядеть функция "пауза":
Element[proto].pause = function () {
animationElements[this.id] && animationElements[length]--;
this._paused_anim = animationElements[this.id];
delete animationElements[this.id];
return this;
};
это сохраняет анимацию, которая будет возобновлена позже. тогда
Element[proto].unpause = function () {
this._paused_anim && (animationElements[this.id]=this._paused_anim);
++animationElements[length] == 1 && animation();
return this;
};
не будет паузы. Учитывая условия определения области, эти две функции, возможно, потребуется ввести прямо в исходный код Raphael (это core hacking, я знаю, но иногда нет альтернативы). Я поместил бы его прямо под функцией "стоп", показанной выше.
попробуйте, и скажите мне, как это происходит.
== = = = EDIT====
Ok, поэтому, похоже, вам придется изменить атрибут "start"animationElements[this.id] ... что-то вроде:
this._pause_time = (+new Date) - animationElements[this.id].start;
в паузе, а затем
animationElements[this.id].start = (+new Date) - this._pause_time;
на резюме.
http://github.com/DmitryBaranovskiy/raphael/blob/master/raphael.js#L3064