var easingFuncs = require("./easing");
var _constants = require("../utils/constants");
var mathMin = _constants.mathMin;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* @class qrenderer.animation.Timeline
* Timeline, designed to calculate the value of an attribute at a specified point.
*
*
* 时间线,用来计算元素上的某个属性在指定时间点上的数值。
*
* @author 大漠穷秋 <damoqiongqiu@126.com>
* @docauthor 大漠穷秋 <damoqiongqiu@126.com>
*/
var Timeline =
/*#__PURE__*/
function () {
/**
* @method constructor Timeline
* @param {Object} options
* @param {Element} options.element
* @param {Number} options.life
* @param {Number} options.delay
* @param {Boolean} options.loop
* @param {Number} options.gap
* @param {Function} options.onframe
* @param {String} options.easing
* @param {Function} options.ondestroy
* @param {Function} options.onrestart
*/
function Timeline(options) {
_classCallCheck(this, Timeline);
this.element = options.element;
this.lifeTime = options.lifeTime || 1000;
this.delay = options.delay || 0;
this.loop = options.loop == null ? false : options.loop;
this.gap = options.gap || 0;
this.easing = options.easing || 'Linear';
this.onframe = options.onframe;
this.ondestroy = options.ondestroy;
this.onrestart = options.onrestart;
this._initialized = false;
this._pausedTime = 0;
this._paused = false;
}
/**
* @method nextFrame
* Enter next frame.
*
*
* 进入下一帧。
* @param {Number} globalTime 当前时间
* @param {Number} deltaTime 时间偏移量
*/
_createClass(Timeline, [{
key: "nextFrame",
value: function nextFrame(globalTime, deltaTime) {
// Set startTime on first frame, or _startTime may has milleseconds different between clips
// PENDING
if (!this._initialized) {
this._startTime = globalTime + this.delay;
this._initialized = true;
}
if (this._paused) {
this._pausedTime += deltaTime;
return;
}
var percent = (globalTime - this._startTime - this._pausedTime) / this.lifeTime;
if (percent < 0) {
return;
}
percent = mathMin(percent, 1);
var easing = this.easing;
var easingFunc = typeof easing === 'string' ? easingFuncs[easing] : easing;
var schedule = typeof easingFunc === 'function' ? easingFunc(percent) : percent;
if (percent === 1) {
if (this.loop) {
this.restart(globalTime);
return 'restart';
}
return 'destroy';
} else {
this.fire('frame', schedule);
return percent;
}
}
/**
* @method restart
* Restart the animation.
*
*
* 重新开始动画。
* @param {Number} globalTime
*/
}, {
key: "restart",
value: function restart(globalTime) {
var remainder = (globalTime - this._startTime - this._pausedTime) % this.lifeTime;
this._startTime = globalTime - remainder + this.gap;
this._pausedTime = 0;
}
/**
* @method fire
* Fire an event.
*
*
* 触发事件。
* @param {String} eventType
* @param {Object} arg
*/
}, {
key: "fire",
value: function fire(eventType, arg) {
eventType = 'on' + eventType;
if (this[eventType]) {
this[eventType](this.element, arg);
}
}
/**
* @method pause
* Pause the animation.
*
*
* 暂停动画。
*/
}, {
key: "pause",
value: function pause() {
this._paused = true;
}
/**
* @method resume
* Resume the animation.
*
*
* 恢复运行。
*/
}, {
key: "resume",
value: function resume() {
this._paused = false;
}
}]);
return Timeline;
}();
module.exports = Timeline;