From 97d942c8e2ef93121f5d257304cca1538150e634 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 10 Nov 2016 10:18:42 -0700 Subject: [PATCH 1/2] Correctly prune completed animation series --- src/ol/view.js | 8 +++++--- test/spec/ol/view.test.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/ol/view.js b/src/ol/view.js index 61b4640ee9..d99c613a15 100644 --- a/src/ol/view.js +++ b/src/ol/view.js @@ -305,7 +305,7 @@ ol.View.prototype.updateAnimations_ = function() { } var elapsed = now - animation.start; var fraction = elapsed / animation.duration; - if (fraction > 1) { + if (fraction >= 1) { animation.complete = true; fraction = 1; } else { @@ -345,14 +345,16 @@ ol.View.prototype.updateAnimations_ = function() { } } if (seriesComplete) { + this.animations_[i] = null; this.setHint(ol.View.Hint.ANIMATING, -1); - var completed = this.animations_.pop(); - var callback = completed[0].callback; + var callback = series[0].callback; if (callback) { callback(true); } } } + // prune completed series + this.animations_ = this.animations_.filter(Boolean); if (more && this.updateAnimationKey_ === undefined) { this.updateAnimationKey_ = requestAnimationFrame(this.updateAnimations_); } diff --git a/test/spec/ol/view.test.js b/test/spec/ol/view.test.js index cf5d4dacba..6e36870a25 100644 --- a/test/spec/ol/view.test.js +++ b/test/spec/ol/view.test.js @@ -484,6 +484,39 @@ describe('ol.View', function() { }); + it('completes multiple staggered animations run in parallel', function(done) { + + var view = new ol.View({ + center: [0, 0], + zoom: 0 + }); + + var calls = 0; + + view.animate({ + zoom: 1, + duration: 25 + }, function() { + ++calls; + }); + + setTimeout(function() { + expect(view.getZoom() > 0).to.be(true); + expect(view.getZoom() < 1).to.be(true); + expect(view.getAnimating()).to.be(true); + view.animate({ + zoom: 2, + duration: 25 + }, function() { + expect(calls).to.be(1); + expect(view.getZoom()).to.roughlyEqual(2, 1e-8); + expect(view.getAnimating()).to.be(false); + done(); + }); + }, 10); + + }); + }); describe('#getResolutions', function() { From 291766c48debad3f585a55be874576f2fb8e9ebb Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 10 Nov 2016 10:20:47 -0700 Subject: [PATCH 2/2] Let people zoom a lot with the button --- src/ol/control/zoom.js | 3 +++ src/ol/view.js | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/ol/control/zoom.js b/src/ol/control/zoom.js index 390578d332..a72e5c5eb9 100644 --- a/src/ol/control/zoom.js +++ b/src/ol/control/zoom.js @@ -106,6 +106,9 @@ ol.control.Zoom.prototype.zoomByDelta_ = function(delta) { if (currentResolution) { var newResolution = view.constrainResolution(currentResolution, delta); if (this.duration_ > 0) { + if (view.getAnimating()) { + view.cancelAnimations(); + } view.animate({ resolution: newResolution, duration: this.duration_, diff --git a/src/ol/view.js b/src/ol/view.js index d99c613a15..e2efd2bd0b 100644 --- a/src/ol/view.js +++ b/src/ol/view.js @@ -271,7 +271,7 @@ ol.View.prototype.getAnimating = function() { /** * Cancel any ongoing animations. */ -ol.View.prototype.cancelAnimations_ = function() { +ol.View.prototype.cancelAnimations = function() { for (var i = 0, ii = this.animations_.length; i < ii; ++i) { var series = this.animations_[i]; if (series[0].callback) { @@ -809,7 +809,7 @@ ol.View.prototype.rotate = function(rotation, opt_anchor) { ol.View.prototype.setCenter = function(center) { this.set(ol.View.Property.CENTER, center); if (this.getAnimating()) { - this.cancelAnimations_(); + this.cancelAnimations(); } }; @@ -838,7 +838,7 @@ ol.View.prototype.setHint = function(hint, delta) { ol.View.prototype.setResolution = function(resolution) { this.set(ol.View.Property.RESOLUTION, resolution); if (this.getAnimating()) { - this.cancelAnimations_(); + this.cancelAnimations(); } }; @@ -852,7 +852,7 @@ ol.View.prototype.setResolution = function(resolution) { ol.View.prototype.setRotation = function(rotation) { this.set(ol.View.Property.ROTATION, rotation); if (this.getAnimating()) { - this.cancelAnimations_(); + this.cancelAnimations(); } };