Skip to content

Commit

Permalink
Use requestAnimationFrame for tweening.
Browse files Browse the repository at this point in the history
Instead of using an arbitrary interval for tweening, we let the device decide the best animation frame rate.  Where requestAnimationFrame is not available, this will default to 60 fps.
  • Loading branch information
tschaub committed Jan 3, 2012
1 parent 5c2af14 commit c151b04
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 22 deletions.
27 changes: 10 additions & 17 deletions lib/OpenLayers/Tween.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,6 @@
*/
OpenLayers.Tween = OpenLayers.Class({

/**
* Constant: INTERVAL
* {int} Interval in milliseconds between 2 steps
*/
INTERVAL: 10,

/**
* APIProperty: easing
* {<OpenLayers.Easing>(Function)} Easing equation used for the animation
Expand Down Expand Up @@ -58,10 +52,10 @@ OpenLayers.Tween = OpenLayers.Class({
time: null,

/**
* Property: interval
* {int} Interval id returned by window.setInterval
* Property: animationId
* {int} Loop id returned by OpenLayers.Util.loopAnimation
*/
interval: null,
animationId: null,

/**
* Property: playing
Expand Down Expand Up @@ -97,15 +91,14 @@ OpenLayers.Tween = OpenLayers.Class({
this.duration = duration;
this.callbacks = options.callbacks;
this.time = 0;
if (this.interval) {
window.clearInterval(this.interval);
this.interval = null;
}
OpenLayers.Util.stopAnimation(this.animationId);
this.animationId = null;
if (this.callbacks && this.callbacks.start) {
this.callbacks.start.call(this, this.begin);
}
this.interval = window.setInterval(
OpenLayers.Function.bind(this.play, this), this.INTERVAL);
this.animationId = OpenLayers.Util.loopAnimation(
OpenLayers.Function.bind(this.play, this)
);
},

/**
Expand All @@ -121,8 +114,8 @@ OpenLayers.Tween = OpenLayers.Class({
if (this.callbacks && this.callbacks.done) {
this.callbacks.done.call(this, this.finish);
}
window.clearInterval(this.interval);
this.interval = null;
OpenLayers.Util.stopAnimation(this.animationId);
this.animationId = null;
this.playing = false;
},

Expand Down
10 changes: 5 additions & 5 deletions tests/Tween.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
}
}
tween.start(start, finish, 10, {callbacks: callbacks});
t.ok(tween.interval != null, "interval correctly set");
t.ok(tween.animationId != null, "animationId correctly set");
t.delay_call(0.8, function() {
t.eq(_start, true, "start callback called");
t.eq(_done, true, "finish callback called");
Expand All @@ -49,15 +49,15 @@
t.plan(2);

var tween = new OpenLayers.Tween();
tween.interval = window.setInterval(function() {}, 10);
tween.animationId = OpenLayers.Util.loopAnimation(function() {});
tween.playing = true;
tween.stop();
t.eq(tween.interval, null, "tween correctly stopped");
t.eq(tween.animationId, null, "tween correctly stopped");

tween.interval = window.setInterval(function() {}, 10);
tween.animationId = OpenLayers.Util.loopAnimation(function() {});
tween.playing = false;
tween.stop();
t.ok(tween.interval != null, "stop method doesn't do anything if tween isn't running");
t.ok(tween.animationId != null, "stop method doesn't do anything if tween isn't running");
}

</script>
Expand Down

0 comments on commit c151b04

Please sign in to comment.