UNPKG

4.19 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = void 0;
9
10var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
12var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
14var _timelime = _interopRequireDefault(require("./timelime"));
15
16var _animator2 = _interopRequireDefault(require("./animator"));
17
18var _jsx = require("../../jsx");
19
20// 遍历全部节点
21function eachElement(element, fn) {
22 fn(element);
23 var children = element.get('children');
24
25 if (children && children.length) {
26 for (var i = 0, len = children.length; i < len; i++) {
27 var child = children[i];
28 eachElement(child, fn);
29 }
30 }
31}
32
33var Animation = /*#__PURE__*/function () {
34 function Animation(canvas) {
35 (0, _classCallCheck2.default)(this, Animation);
36 this.timeline = new _timelime.default();
37 this.canvas = canvas;
38 }
39
40 (0, _createClass2.default)(Animation, [{
41 key: "createAnimator",
42 value: function createAnimator(element, animation) {
43 var duration = animation.duration,
44 property = animation.property,
45 onFrame = animation.onFrame; // 校验关键参数
46
47 if (!duration || (!property || !property.length) && !onFrame) {
48 return;
49 }
50
51 return new _animator2.default(element, animation);
52 }
53 }, {
54 key: "play",
55 value: function play(container, onAnimationEnd) {
56 var _this = this;
57
58 var canvas = this.canvas;
59 var animators = [];
60 var maxDuration = 0;
61 var deleteElements = []; // 遍历整个树,找到全部需要动画的元素
62
63 eachElement(container, function (element) {
64 // TODO: status 需要提取状态
65 var _element$_attrs = element._attrs,
66 animation = _element$_attrs.animation,
67 status = _element$_attrs.status;
68
69 if (!animation) {
70 if (status === _jsx.ElementStatus.ELEMENT_DELETE) {
71 // element.remove(true);
72 deleteElements.push(element);
73 }
74
75 return;
76 }
77
78 var animator = _this.createAnimator(element, animation);
79
80 if (animator) {
81 maxDuration = Math.max(maxDuration, animator.totalDuration);
82 animators.push(animator);
83 }
84
85 var clip = animation.clip; // 如果有裁剪区动画,处理裁剪区动画
86
87 if (clip) {
88 clip.isClip = true;
89 var clipElement = clip.element;
90
91 var _animator = _this.createAnimator(clipElement, clip);
92
93 if (_animator) {
94 maxDuration = Math.max(maxDuration, _animator.totalDuration);
95 element.attr('clip', clipElement);
96 animators.push(_animator);
97 }
98 }
99 });
100
101 for (var i = 0, len = deleteElements.length; i < len; i++) {
102 var element = deleteElements[i];
103 var children = element._attrs.children; // 因为group的子元素也有可能有动画,所以这里先把叶子节点删除掉,等动画结束后,再把所有删除的元素删除掉
104
105 if (!children || !children.length) {
106 element.remove(true);
107 }
108 } // 开始播放动画
109
110
111 this.timeline.play(maxDuration, function (time) {
112 for (var _i = 0, _len = animators.length; _i < _len; _i++) {
113 var animator = animators[_i];
114 animator.to(time);
115 } // 最后一帧放在end里统一draw, 避免重复draw
116
117
118 if (time < maxDuration) {
119 canvas.draw();
120 }
121 }, function () {
122 for (var _i2 = 0, _len2 = deleteElements.length; _i2 < _len2; _i2++) {
123 var _element = deleteElements[_i2];
124
125 _element.remove(true);
126 }
127
128 canvas.draw();
129 onAnimationEnd && onAnimationEnd();
130 });
131 } // 直接跳到动画最终态
132
133 }, {
134 key: "end",
135 value: function end() {
136 this.timeline.end();
137 }
138 }, {
139 key: "abort",
140 value: function abort() {
141 this.timeline.abort();
142 }
143 }]);
144 return Animation;
145}();
146
147var _default = Animation;
148exports.default = _default;
\No newline at end of file