UNPKG

bodymovin

Version:

After Effects plugin for exporting animations to SVG + JavaScript or canvas + JavaScript

214 lines (187 loc) 5.93 kB
var animationManager = (function(){ var moduleOb = {}; var registeredAnimations = []; var initTime = 0; var len = 0; var idled = true; var playingAnimationsNum = 0; function removeElement(ev){ var i = 0; var animItem = ev.target; while(i<len) { if (registeredAnimations[i].animation === animItem) { registeredAnimations.splice(i, 1); i -= 1; len -= 1; if(!animItem.isPaused){ subtractPlayingCount(); } } i += 1; } } function registerAnimation(element, animationData){ if(!element){ return null; } var i=0; while(i<len){ if(registeredAnimations[i].elem == element && registeredAnimations[i].elem !== null ){ return registeredAnimations[i].animation; } i+=1; } var animItem = new AnimationItem(); setupAnimation(animItem, element); animItem.setData(element, animationData); return animItem; } function addPlayingCount(){ playingAnimationsNum += 1; activate(); } function subtractPlayingCount(){ playingAnimationsNum -= 1; if(playingAnimationsNum === 0){ idled = true; } } function setupAnimation(animItem, element){ animItem.addEventListener('destroy',removeElement); animItem.addEventListener('_active',addPlayingCount); animItem.addEventListener('_idle',subtractPlayingCount); registeredAnimations.push({elem: element,animation:animItem}); len += 1; } function loadAnimation(params){ var animItem = new AnimationItem(); setupAnimation(animItem, null); animItem.setParams(params); return animItem; } function setSpeed(val,animation){ var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.setSpeed(val, animation); } } function setDirection(val, animation){ var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.setDirection(val, animation); } } function play(animation){ var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.play(animation); } } function moveFrame (value, animation) { initTime = Date.now(); var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.moveFrame(value,animation); } } function resume(nowTime) { var elapsedTime = nowTime - initTime; var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.advanceTime(elapsedTime); } initTime = nowTime; if(!idled) { window.requestAnimationFrame(resume); } } function first(nowTime){ initTime = nowTime; window.requestAnimationFrame(resume); } function pause(animation) { var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.pause(animation); } } function goToAndStop(value,isFrame,animation) { var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.goToAndStop(value,isFrame,animation); } } function stop(animation) { var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.stop(animation); } } function togglePause(animation) { var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.togglePause(animation); } } function destroy(animation) { var i; for(i=(len-1);i>=0;i-=1){ registeredAnimations[i].animation.destroy(animation); } } function searchAnimations(animationData, standalone, renderer){ var animElements = document.getElementsByClassName('bodymovin'); var i, len = animElements.length; for(i=0;i<len;i+=1){ if(renderer){ animElements[i].setAttribute('data-bm-type',renderer); } registerAnimation(animElements[i], animationData); } if(standalone && len === 0){ if(!renderer){ renderer = 'svg'; } var body = document.getElementsByTagName('body')[0]; body.innerHTML = ''; var div = document.createElement('div'); div.style.width = '100%'; div.style.height = '100%'; div.setAttribute('data-bm-type',renderer); body.appendChild(div); registerAnimation(div, animationData); } } function resize(){ var i; for(i=0;i<len;i+=1){ registeredAnimations[i].animation.resize(); } } function start(){ window.requestAnimationFrame(first); } function activate(){ if(idled){ idled = false; window.requestAnimationFrame(first); } } //start(); setTimeout(start,0); moduleOb.registerAnimation = registerAnimation; moduleOb.loadAnimation = loadAnimation; moduleOb.setSpeed = setSpeed; moduleOb.setDirection = setDirection; moduleOb.play = play; moduleOb.moveFrame = moveFrame; moduleOb.pause = pause; moduleOb.stop = stop; moduleOb.togglePause = togglePause; moduleOb.searchAnimations = searchAnimations; moduleOb.resize = resize; moduleOb.start = start; moduleOb.goToAndStop = goToAndStop; moduleOb.destroy = destroy; return moduleOb; }());