@antv/f2
Version:
Charts for mobile visualization.
123 lines (122 loc) • 4.19 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _timelime = _interopRequireDefault(require("./timelime"));
var _animator2 = _interopRequireDefault(require("./animator"));
var _jsx = require("../../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) {
(0, _classCallCheck2.default)(this, Animation);
this.timeline = new _timelime.default();
this.canvas = canvas;
}
(0, _createClass2.default)(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 _animator2.default(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 === _jsx.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;
}();
var _default = Animation;
exports.default = _default;