다음 코드는 경로를 따라 객체 ("태그")에 애니메이션을 적용하는 데 필요한 좌표 (x, y, t)입니다. 여기서 t는 시간 이 좌표와 다음 좌표 사이의 거리 (ms) - 개체의 가속/감속을 설명합니다.이 경로는 사용자의 마우스 동작에서 생성되며 높은 정밀도가 바람직합니다. 프로젝트는 d3.js를 사용하여 SVG를 애니메이션으로 만듭니다.d3/Javascript 애니메이션이 실행되고 있지 않을 때
function Animation(tag,path) {
this.tag = tag;
this.path = path;
}
Animation.prototype = {
start : function() {
console.log('Animation created');
var i = 0;
var nextTime = this.path[0].t;
var thisClass = this;
setTimeout(function(){}, nextTime);
console.log('Beginning animation');
function step() {
setTimeout(function(){
if(i == thisClass.path.length -1) {
var now = new Date();
console.log('Animation for '+ thisClass.tag.attr('id') + ' played at ' + (now - globalTimer) + 'ms.');
return;
}
if(i === 0) {
var now = new Date();
console.log('Animation for '+ thisClass.tag.attr('id') + ' started at ' + (now - globalTimer) + 'ms.');
}
thisClass.tag
.attr('cx', thisClass.path[i].x)
.attr('cy', thisClass.path[i].y);
i++;
requestAnimationFrame(step);
}, thisClass.path.t);
}
requestAnimationFrame(step);
}
};
또 다른 클래스는 각 애니메이션이 재생되어야 할 때를 계획합니다. 예를 들어, 30 초 동안 3 건의 애니메이션을 재생해야합니다 (03, 09, : 25). 애니메이션이 재생 될 필요가되면, 스케줄러를 호출
new Animation(Tag, Path).start();
문제 : 스케줄러가 제 시간에 제대로 각 애니메이션을 호출 있지만, 기능 step()
의 어떤 인스턴스가 제 시간에 실행되지 않습니다 - 그들은 모두 기록 된 기간의 끝에서 즉시 일어나는 것처럼 보입니다. 하나는 내 로그를 희망하면서 그래서 다음과 같이 보일 수 있습니다 :
애니메이션
이
애니메이션
애니메이션
애니메이션
을했다
부터 애니메이션을 만들어 연주 애니메이션을 시작 만들어 ...
... 대신 다음과 같이 보입니다.
01 자세한 내용은 http://puu.sh/4Ucw9.png : 23,516,는 애니메이션부터 애니메이션
애니메이션은 애니메이션
(편집 플레이
(2)
애니메이션을 시작
을 만들어
만들었습니다. "애니메이션 푸시 됨"은 new Animation(...)
의 직후에 나오므로 이론적으로 애니메이션이 완성 된 후에 나타납니다. 보시다시피 세 개의 태그 (c0, c1, c2)는 각각 다른 ms 기호로 호출되지만, 세 가지 모두의 애니메이션은 7019ms에서 시작되었습니다.
애니메이션은 호출 할 때 재생해야합니다. 기간의 끝. 그들은 대기열에 쌓여 있고 한꺼번에 모든 것을 집행하는 것 같지만, 이해할 때까지는 그렇게하지 말라고 말하지 않았습니다. 나는 어쨌든 requestAnimationFrame
이 열쇠라고 생각하지만, 어제 그것을 사용하기 시작 했으므로 나는 아직도 그것이하는 것과 사용하는 방법을 100 % 확신하지 못하고있다. 아무도 무슨 일이 일어나는지 알아?
원시 애니메이션 프레임을 사용하는 특별한 이유가 있습니까? D3의 전환으로이 모든 것을 할 수 있습니다. –
원시 애니메이션 프레임을 계속 사용 하겠지만 100 % 확신 할 수는 없지만 지금까지는 관리 및 구현이 가장 쉽습니다. 그들은 좀 지저분하지만, 우선 프로토 타입의 기초를 먼저 얻은 다음, 코드를 빠르고 훌륭하게 만들 것입니다. –
나는 이것이 전환과 함께 훨씬 쉬울 것이라고 말하고있다. –