mirror of
https://github.com/Hopiu/fabric.js.git
synced 2026-05-10 14:54:42 +00:00
71 lines
2.9 KiB
JavaScript
71 lines
2.9 KiB
JavaScript
(function() {
|
|
|
|
/**
|
|
* Changes value from one to another within certain period of time, invoking callbacks as value is being changed.
|
|
* @memberOf fabric.util
|
|
* @param {Object} [options] Animation options
|
|
* @param {Function} [options.onChange] Callback; invoked on every value change
|
|
* @param {Function} [options.onComplete] Callback; invoked when value change is completed
|
|
* @param {Number} [options.startValue=0] Starting value
|
|
* @param {Number} [options.endValue=100] Ending value
|
|
* @param {Number} [options.byValue=100] Value to modify the property by
|
|
* @param {Function} [options.easing] Easing function
|
|
* @param {Number} [options.duration=500] Duration of change
|
|
*/
|
|
function animate(options) {
|
|
|
|
requestAnimFrame(function(timestamp) {
|
|
options || (options = { });
|
|
|
|
var start = timestamp || +new Date(),
|
|
duration = options.duration || 500,
|
|
finish = start + duration, time,
|
|
onChange = options.onChange || function() { },
|
|
abort = options.abort || function() { return false; },
|
|
easing = options.easing || function(t, b, c, d) {return -c * Math.cos(t/d * (Math.PI/2)) + c + b;},
|
|
startValue = 'startValue' in options ? options.startValue : 0,
|
|
endValue = 'endValue' in options ? options.endValue : 100,
|
|
byValue = options.byValue || endValue - startValue;
|
|
|
|
options.onStart && options.onStart();
|
|
|
|
(function tick(ticktime) {
|
|
time = ticktime || +new Date();
|
|
var currentTime = time > finish ? duration : (time - start);
|
|
if (abort()) {
|
|
options.onComplete && options.onComplete();
|
|
return;
|
|
}
|
|
onChange(easing(currentTime, startValue, byValue, duration));
|
|
if (time > finish) {
|
|
options.onComplete && options.onComplete();
|
|
return;
|
|
}
|
|
requestAnimFrame(tick);
|
|
})(start);
|
|
});
|
|
|
|
}
|
|
|
|
var _requestAnimFrame = fabric.window.requestAnimationFrame ||
|
|
fabric.window.webkitRequestAnimationFrame ||
|
|
fabric.window.mozRequestAnimationFrame ||
|
|
fabric.window.oRequestAnimationFrame ||
|
|
fabric.window.msRequestAnimationFrame ||
|
|
function(callback) {
|
|
fabric.window.setTimeout(callback, 1000 / 60);
|
|
};
|
|
/**
|
|
* requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/
|
|
* @memberOf fabric.util
|
|
* @param {Function} callback Callback to invoke
|
|
* @param {DOMElement} element optional Element to associate with animation
|
|
*/
|
|
var requestAnimFrame = function() {
|
|
return _requestAnimFrame.apply(fabric.window, arguments);
|
|
};
|
|
|
|
fabric.util.animate = animate;
|
|
fabric.util.requestAnimFrame = requestAnimFrame;
|
|
|
|
})();
|