Date.now() is not supported in Internet Explorer up to IE 9. The goog.now() method can be used as a replacement.
143 lines
5.1 KiB
JavaScript
143 lines
5.1 KiB
JavaScript
// FIXME works for View2D only
|
|
// FIXME dependency on ol.View2D suppressed to prevent dependency loop
|
|
|
|
goog.provide('ol.animation');
|
|
|
|
goog.require('goog.fx.easing');
|
|
goog.require('ol.PreRenderFunction');
|
|
goog.require('ol.easing');
|
|
|
|
|
|
/**
|
|
* @param {number} resolution Resolution.
|
|
* @param {number=} opt_duration Duration.
|
|
* @param {number=} opt_start Start.
|
|
* @param {function(number): number=} opt_easingFunction Easing function.
|
|
* @return {ol.PreRenderFunction} Pre-render function.
|
|
*/
|
|
ol.animation.createBounce =
|
|
function(resolution, opt_duration, opt_start, opt_easingFunction) {
|
|
var start = goog.isDef(opt_start) ? opt_start : goog.now();
|
|
var duration = goog.isDef(opt_duration) ? opt_duration : 1000;
|
|
var easingFunction = goog.isDef(opt_easingFunction) ?
|
|
opt_easingFunction : ol.easing.upAndDown;
|
|
return function(map, frameState) {
|
|
if (frameState.time < start) {
|
|
frameState.animate = true;
|
|
frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
|
|
return true;
|
|
} else if (frameState.time < start + duration) {
|
|
var delta = easingFunction((frameState.time - start) / duration);
|
|
var deltaResolution = resolution - frameState.view2DState.resolution;
|
|
frameState.animate = true;
|
|
frameState.view2DState.resolution += delta * deltaResolution;
|
|
frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {ol.Coordinate} source Source.
|
|
* @param {number=} opt_duration Duration.
|
|
* @param {number=} opt_start Start.
|
|
* @param {function(number): number=} opt_easingFunction Easing function.
|
|
* @return {ol.PreRenderFunction} Pre-render function.
|
|
*/
|
|
ol.animation.createPanFrom =
|
|
function(source, opt_duration, opt_start, opt_easingFunction) {
|
|
var start = goog.isDef(opt_start) ? opt_start : goog.now();
|
|
var sourceX = source.x;
|
|
var sourceY = source.y;
|
|
var duration = goog.isDef(opt_duration) ? opt_duration : 1000;
|
|
var easingFunction = goog.isDef(opt_easingFunction) ?
|
|
opt_easingFunction : goog.fx.easing.inAndOut;
|
|
return function(map, frameState) {
|
|
if (frameState.time < start) {
|
|
frameState.animate = true;
|
|
frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
|
|
return true;
|
|
} else if (frameState.time < start + duration) {
|
|
var delta = 1 - easingFunction((frameState.time - start) / duration);
|
|
var deltaX = sourceX - frameState.view2DState.center.x;
|
|
var deltaY = sourceY - frameState.view2DState.center.y;
|
|
frameState.animate = true;
|
|
frameState.view2DState.center.x += delta * deltaX;
|
|
frameState.view2DState.center.y += delta * deltaY;
|
|
frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {number=} opt_duration Duration.
|
|
* @param {number=} opt_turns Turns.
|
|
* @param {number=} opt_start Start.
|
|
* @param {function(number): number=} opt_easingFunction Easing function.
|
|
* @return {ol.PreRenderFunction} Pre-render function.
|
|
*/
|
|
ol.animation.createSpin =
|
|
function(opt_duration, opt_turns, opt_start, opt_easingFunction) {
|
|
var start = goog.isDef(opt_start) ? opt_start : goog.now();
|
|
var duration = goog.isDef(opt_duration) ? opt_duration : 1000;
|
|
var turns = goog.isDef(opt_turns) ? opt_turns : 1;
|
|
var deltaTheta = 2 * turns * Math.PI;
|
|
var easingFunction = goog.isDef(opt_easingFunction) ?
|
|
opt_easingFunction : goog.fx.easing.inAndOut;
|
|
return function(map, frameState) {
|
|
if (frameState.time < start) {
|
|
frameState.animate = true;
|
|
frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
|
|
return true;
|
|
} else if (frameState.time < start + duration) {
|
|
var delta = easingFunction((frameState.time - start) / duration);
|
|
frameState.animate = true;
|
|
frameState.view2DState.rotation += delta * deltaTheta;
|
|
frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {number} sourceResolution Source resolution.
|
|
* @param {number=} opt_duration Duration.
|
|
* @param {number=} opt_start Start.
|
|
* @param {function(number): number=} opt_easingFunction Easing function.
|
|
* @return {ol.PreRenderFunction} Pre-render function.
|
|
*/
|
|
ol.animation.createZoomFrom =
|
|
function(sourceResolution, opt_duration, opt_start, opt_easingFunction) {
|
|
var start = goog.isDef(opt_start) ? opt_start : goog.now();
|
|
var duration = goog.isDef(opt_duration) ? opt_duration : 1000;
|
|
var easingFunction = goog.isDef(opt_easingFunction) ?
|
|
opt_easingFunction : ol.easing.linear;
|
|
return function(map, frameState) {
|
|
if (frameState.time < start) {
|
|
frameState.animate = true;
|
|
frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
|
|
return true;
|
|
} else if (frameState.time < start + duration) {
|
|
var delta = 1 - easingFunction((frameState.time - start) / duration);
|
|
var deltaResolution =
|
|
sourceResolution - frameState.view2DState.resolution;
|
|
frameState.animate = true;
|
|
frameState.view2DState.resolution += delta * deltaResolution;
|
|
frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
};
|