rc-tween-one
Version:
tween-one anim component for react
118 lines (108 loc) • 2.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _raf = require('raf');
var _raf2 = _interopRequireDefault(_raf);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var getTime = Date.now || function () {
return new Date().getTime();
}; /* eslint-disable func-names */
var Ticker = function Ticker() {};
Ticker.prototype = {
tickFnArray: [],
tickKeyObject: {},
id: -1,
tweenId: 0,
frame: 0,
perFrame: Math.round(1000 / 60),
elapsed: 0,
lastUpdate: getTime()
};
var p = Ticker.prototype;
p.add = function (fn) {
var key = 'TweenOneTicker' + this.tweenId;
this.tweenId++;
this.wake(key, fn);
return key;
};
p.wake = function (key, fn) {
var _this = this;
this.tickKeyObject[key] = fn;
this.tickFnArray = Object.keys(this.tickKeyObject).map(function (k) {
return _this.tickKeyObject[k];
});
if (this.id === -1) {
this.id = (0, _raf2['default'])(this.tick);
}
};
p.clear = function (key) {
var _this2 = this;
delete this.tickKeyObject[key];
this.tickFnArray = Object.keys(this.tickKeyObject).map(function (k) {
return _this2.tickKeyObject[k];
});
};
p.sleep = function () {
_raf2['default'].cancel(this.id);
this.id = -1;
this.frame = 0;
};
var ticker = new Ticker();
p.tick = function (a) {
ticker.elapsed = getTime() - ticker.lastUpdate;
ticker.lastUpdate += ticker.elapsed;
ticker.tickFnArray.forEach(function (func) {
return func(a);
});
// 如果 object 里没对象了,自动杀掉;
if (!ticker.tickFnArray.length) {
ticker.sleep();
return;
}
if (!ticker.frame) {
ticker.frame++;
} else {
ticker.frame += Math.round(ticker.elapsed / ticker.perFrame);
}
ticker.id = (0, _raf2['default'])(ticker.tick);
};
var timeoutIdNumber = 0;
p.timeout = function (fn, time) {
var _this3 = this;
if (!(typeof fn === 'function')) {
return console.warn('not function'); // eslint-disable-line
}
var timeoutID = 'timeout' + Date.now() + '-' + timeoutIdNumber;
var startFrame = this.frame;
this.wake(timeoutID, function () {
var moment = (_this3.frame - startFrame) * _this3.perFrame;
if (moment >= (time || 0)) {
_this3.clear(timeoutID);
fn();
}
});
timeoutIdNumber++;
return timeoutID;
};
var intervalIdNumber = 0;
p.interval = function (fn, time) {
var _this4 = this;
if (!(typeof fn === 'function')) {
console.warn('not function'); // eslint-disable-line
return null;
}
var intervalID = 'interval' + Date.now() + '-' + intervalIdNumber;
var starFrame = this.frame;
this.wake(intervalID, function () {
var moment = (_this4.frame - starFrame) * _this4.perFrame;
if (moment >= (time || 0)) {
starFrame = _this4.frame;
fn();
}
});
intervalIdNumber++;
return intervalID;
};
exports['default'] = ticker;
module.exports = exports['default'];