AnimationManager.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import createTag from '../utils/helpers/html_elements';
  2. import AnimationItem from './AnimationItem';
  3. const animationManager = (function () {
  4. var moduleOb = {};
  5. var registeredAnimations = [];
  6. var initTime = 0;
  7. var len = 0;
  8. var playingAnimationsNum = 0;
  9. var _stopped = true;
  10. var _isFrozen = false;
  11. function removeElement(ev) {
  12. var i = 0;
  13. var animItem = ev.target;
  14. while (i < len) {
  15. if (registeredAnimations[i].animation === animItem) {
  16. registeredAnimations.splice(i, 1);
  17. i -= 1;
  18. len -= 1;
  19. if (!animItem.isPaused) {
  20. subtractPlayingCount();
  21. }
  22. }
  23. i += 1;
  24. }
  25. }
  26. function registerAnimation(element, animationData) {
  27. if (!element) {
  28. return null;
  29. }
  30. var i = 0;
  31. while (i < len) {
  32. if (registeredAnimations[i].elem === element && registeredAnimations[i].elem !== null) {
  33. return registeredAnimations[i].animation;
  34. }
  35. i += 1;
  36. }
  37. var animItem = new AnimationItem();
  38. setupAnimation(animItem, element);
  39. animItem.setData(element, animationData);
  40. return animItem;
  41. }
  42. function getRegisteredAnimations() {
  43. var i;
  44. var lenAnims = registeredAnimations.length;
  45. var animations = [];
  46. for (i = 0; i < lenAnims; i += 1) {
  47. animations.push(registeredAnimations[i].animation);
  48. }
  49. return animations;
  50. }
  51. function addPlayingCount() {
  52. playingAnimationsNum += 1;
  53. activate();
  54. }
  55. function subtractPlayingCount() {
  56. playingAnimationsNum -= 1;
  57. }
  58. function setupAnimation(animItem, element) {
  59. animItem.addEventListener('destroy', removeElement);
  60. animItem.addEventListener('_active', addPlayingCount);
  61. animItem.addEventListener('_idle', subtractPlayingCount);
  62. registeredAnimations.push({ elem: element, animation: animItem });
  63. len += 1;
  64. }
  65. function loadAnimation(params) {
  66. var animItem = new AnimationItem();
  67. setupAnimation(animItem, null);
  68. animItem.setParams(params);
  69. return animItem;
  70. }
  71. function setSpeed(val, animation) {
  72. var i;
  73. for (i = 0; i < len; i += 1) {
  74. registeredAnimations[i].animation.setSpeed(val, animation);
  75. }
  76. }
  77. function setDirection(val, animation) {
  78. var i;
  79. for (i = 0; i < len; i += 1) {
  80. registeredAnimations[i].animation.setDirection(val, animation);
  81. }
  82. }
  83. function play(animation) {
  84. var i;
  85. for (i = 0; i < len; i += 1) {
  86. registeredAnimations[i].animation.play(animation);
  87. }
  88. }
  89. function resume(nowTime) {
  90. var elapsedTime = nowTime - initTime;
  91. var i;
  92. for (i = 0; i < len; i += 1) {
  93. registeredAnimations[i].animation.advanceTime(elapsedTime);
  94. }
  95. initTime = nowTime;
  96. if (playingAnimationsNum && !_isFrozen) {
  97. window.requestAnimationFrame(resume);
  98. } else {
  99. _stopped = true;
  100. }
  101. }
  102. function first(nowTime) {
  103. initTime = nowTime;
  104. window.requestAnimationFrame(resume);
  105. }
  106. function pause(animation) {
  107. var i;
  108. for (i = 0; i < len; i += 1) {
  109. registeredAnimations[i].animation.pause(animation);
  110. }
  111. }
  112. function goToAndStop(value, isFrame, animation) {
  113. var i;
  114. for (i = 0; i < len; i += 1) {
  115. registeredAnimations[i].animation.goToAndStop(value, isFrame, animation);
  116. }
  117. }
  118. function stop(animation) {
  119. var i;
  120. for (i = 0; i < len; i += 1) {
  121. registeredAnimations[i].animation.stop(animation);
  122. }
  123. }
  124. function togglePause(animation) {
  125. var i;
  126. for (i = 0; i < len; i += 1) {
  127. registeredAnimations[i].animation.togglePause(animation);
  128. }
  129. }
  130. function destroy(animation) {
  131. var i;
  132. for (i = (len - 1); i >= 0; i -= 1) {
  133. registeredAnimations[i].animation.destroy(animation);
  134. }
  135. }
  136. function searchAnimations(animationData, standalone, renderer) {
  137. var animElements = [].concat([].slice.call(document.getElementsByClassName('lottie')),
  138. [].slice.call(document.getElementsByClassName('bodymovin')));
  139. var i;
  140. var lenAnims = animElements.length;
  141. for (i = 0; i < lenAnims; i += 1) {
  142. if (renderer) {
  143. animElements[i].setAttribute('data-bm-type', renderer);
  144. }
  145. registerAnimation(animElements[i], animationData);
  146. }
  147. if (standalone && lenAnims === 0) {
  148. if (!renderer) {
  149. renderer = 'svg';
  150. }
  151. var body = document.getElementsByTagName('body')[0];
  152. body.innerText = '';
  153. var div = createTag('div');
  154. div.style.width = '100%';
  155. div.style.height = '100%';
  156. div.setAttribute('data-bm-type', renderer);
  157. body.appendChild(div);
  158. registerAnimation(div, animationData);
  159. }
  160. }
  161. function resize() {
  162. var i;
  163. for (i = 0; i < len; i += 1) {
  164. registeredAnimations[i].animation.resize();
  165. }
  166. }
  167. function activate() {
  168. if (!_isFrozen && playingAnimationsNum) {
  169. if (_stopped) {
  170. window.requestAnimationFrame(first);
  171. _stopped = false;
  172. }
  173. }
  174. }
  175. function freeze() {
  176. _isFrozen = true;
  177. }
  178. function unfreeze() {
  179. _isFrozen = false;
  180. activate();
  181. }
  182. function setVolume(val, animation) {
  183. var i;
  184. for (i = 0; i < len; i += 1) {
  185. registeredAnimations[i].animation.setVolume(val, animation);
  186. }
  187. }
  188. function mute(animation) {
  189. var i;
  190. for (i = 0; i < len; i += 1) {
  191. registeredAnimations[i].animation.mute(animation);
  192. }
  193. }
  194. function unmute(animation) {
  195. var i;
  196. for (i = 0; i < len; i += 1) {
  197. registeredAnimations[i].animation.unmute(animation);
  198. }
  199. }
  200. moduleOb.registerAnimation = registerAnimation;
  201. moduleOb.loadAnimation = loadAnimation;
  202. moduleOb.setSpeed = setSpeed;
  203. moduleOb.setDirection = setDirection;
  204. moduleOb.play = play;
  205. moduleOb.pause = pause;
  206. moduleOb.stop = stop;
  207. moduleOb.togglePause = togglePause;
  208. moduleOb.searchAnimations = searchAnimations;
  209. moduleOb.resize = resize;
  210. // moduleOb.start = start;
  211. moduleOb.goToAndStop = goToAndStop;
  212. moduleOb.destroy = destroy;
  213. moduleOb.freeze = freeze;
  214. moduleOb.unfreeze = unfreeze;
  215. moduleOb.setVolume = setVolume;
  216. moduleOb.mute = mute;
  217. moduleOb.unmute = unmute;
  218. moduleOb.getRegisteredAnimations = getRegisteredAnimations;
  219. return moduleOb;
  220. }());
  221. export default animationManager;