clay-core
Version:
Provide a more friendly web-side drawing interface!
85 lines (78 loc) • 2.25 kB
JavaScript
var _clock = {
//当前正在运动的动画的tick函数堆栈
timers: [],
//唯一定时器的定时间隔
interval: 13,
//指定了动画时长duration默认值
speeds: 400,
//定时器ID
timerId: null
};
// 提供间隔执行方法
clay.animation = function (doback, duration, callback) {
_clock.timer(function (deep) {
//其中deep为0-1,表示改变的程度
doback(deep);
}, duration, callback);
};
//把tick函数推入堆栈
_clock.timer = function (tick, duration, callback) {
if (!_is_function(tick)) {
throw new Error('tick is required!');
}
duration = typeof _is_number(duration) ? duration : _clock.speeds;
if (duration < 0) duration = -duration;
_clock.timers.push({
"createTime": new Date(),
"tick": tick,
"duration": duration,
"callback": callback
});
_clock.start();
};
//开启唯一的定时器timerId
_clock.start = function () {
if (!_clock.timerId) {
_clock.timerId = setInterval(_clock.tick, _clock.interval);
}
};
//被定时器调用,遍历timers堆栈
_clock.tick = function () {
var createTime, flag, tick, callback, timer, duration, passTime, needStop, deep,
timers = _clock.timers;
_clock.timers = [];
_clock.timers.length = 0;
for (flag = 0; flag < timers.length; flag++) {
//初始化数据
timer = timers[flag];
createTime = timer.createTime;
tick = timer.tick;
duration = timer.duration;
callback = timer.callback;
needStop = false;
//执行
passTime = (+new Date() - createTime) / duration;
if (passTime >= 1) {
needStop = true;
}
passTime = passTime > 1 ? 1 : passTime;
deep = passTime;
tick(deep);
if (passTime < 1) {
//动画没有结束再添加
_clock.timers.push(timer);
} else if (callback) {
callback();
}
}
if (_clock.timers.length <= 0) {
_clock.stop();
}
};
//停止定时器,重置timerId=null
_clock.stop = function () {
if (_clock.timerId) {
clearInterval(_clock.timerId);
_clock.timerId = null;
}
};