UNPKG

@antv/f2

Version:

Charts for mobile visualization.

115 lines 3.83 kB
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; import _createClass from "@babel/runtime/helpers/esm/createClass"; import Timeline from './timelime'; import Animator from './animator'; import { ElementStatus } from '../../jsx'; // 遍历全部节点 function eachElement(element, fn) { fn(element); var children = element.get('children'); if (children && children.length) { for (var i = 0, len = children.length; i < len; i++) { var child = children[i]; eachElement(child, fn); } } } var Animation = /*#__PURE__*/function () { function Animation(canvas) { _classCallCheck(this, Animation); this.timeline = new Timeline(); this.canvas = canvas; } _createClass(Animation, [{ key: "createAnimator", value: function createAnimator(element, animation) { var duration = animation.duration, property = animation.property, onFrame = animation.onFrame; // 校验关键参数 if (!duration || (!property || !property.length) && !onFrame) { return; } return new Animator(element, animation); } }, { key: "play", value: function play(container, onAnimationEnd) { var _this = this; var canvas = this.canvas; var animators = []; var maxDuration = 0; var deleteElements = []; // 遍历整个树,找到全部需要动画的元素 eachElement(container, function (element) { // TODO: status 需要提取状态 var _element$_attrs = element._attrs, animation = _element$_attrs.animation, status = _element$_attrs.status; if (!animation) { if (status === ElementStatus.ELEMENT_DELETE) { // element.remove(true); deleteElements.push(element); } return; } var animator = _this.createAnimator(element, animation); if (animator) { maxDuration = Math.max(maxDuration, animator.totalDuration); animators.push(animator); } var clip = animation.clip; // 如果有裁剪区动画,处理裁剪区动画 if (clip) { clip.isClip = true; var clipElement = clip.element; var _animator = _this.createAnimator(clipElement, clip); if (_animator) { maxDuration = Math.max(maxDuration, _animator.totalDuration); element.attr('clip', clipElement); animators.push(_animator); } } }); for (var i = 0, len = deleteElements.length; i < len; i++) { var element = deleteElements[i]; var children = element._attrs.children; // 因为group的子元素也有可能有动画,所以这里先把叶子节点删除掉,等动画结束后,再把所有删除的元素删除掉 if (!children || !children.length) { element.remove(true); } } // 开始播放动画 this.timeline.play(maxDuration, function (time) { for (var _i = 0, _len = animators.length; _i < _len; _i++) { var animator = animators[_i]; animator.to(time); } // 最后一帧放在end里统一draw, 避免重复draw if (time < maxDuration) { canvas.draw(); } }, function () { for (var _i2 = 0, _len2 = deleteElements.length; _i2 < _len2; _i2++) { var _element = deleteElements[_i2]; _element.remove(true); } canvas.draw(); onAnimationEnd && onAnimationEnd(); }); } // 直接跳到动画最终态 }, { key: "end", value: function end() { this.timeline.end(); } }, { key: "abort", value: function abort() { this.timeline.abort(); } }]); return Animation; }(); export default Animation;