diff --git a/src/ol/animation.js b/src/ol/animation.js index 6b80f0accc..e85fccbd5a 100644 --- a/src/ol/animation.js +++ b/src/ol/animation.js @@ -24,12 +24,14 @@ ol.animation.createBounce = 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; @@ -56,6 +58,7 @@ ol.animation.createPanFrom = 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); @@ -64,6 +67,7 @@ ol.animation.createPanFrom = 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; @@ -90,11 +94,13 @@ ol.animation.createSpin = 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; diff --git a/src/ol/framestate.js b/src/ol/framestate.js index 32a7edb31c..d3d0f5ffa7 100644 --- a/src/ol/framestate.js +++ b/src/ol/framestate.js @@ -23,7 +23,8 @@ goog.require('ol.layer.LayerState'); * size: ol.Size, * tileQueue: ol.TileQueue, * time: number, - * view2DState: ol.View2DState}} + * view2DState: ol.View2DState, + * viewHints: Array.}} */ ol.FrameState; diff --git a/src/ol/interaction/dragpaninteraction.js b/src/ol/interaction/dragpaninteraction.js index 32a5acc697..494d953912 100644 --- a/src/ol/interaction/dragpaninteraction.js +++ b/src/ol/interaction/dragpaninteraction.js @@ -6,6 +6,7 @@ goog.require('goog.asserts'); goog.require('ol.Coordinate'); goog.require('ol.MapBrowserEvent'); goog.require('ol.View2D'); +goog.require('ol.ViewHint'); goog.require('ol.interaction.ConditionType'); goog.require('ol.interaction.Drag'); @@ -52,13 +53,25 @@ ol.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { }; +/** + * @inheritDoc + */ +ol.interaction.DragPan.prototype.handleDragEnd = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + map.requestRenderFrame(); + map.getView().setHint(ol.ViewHint.PANNING, -1); +}; + + /** * @inheritDoc */ ol.interaction.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; if (this.condition_(browserEvent)) { - mapBrowserEvent.map.requestRenderFrame(); + var map = mapBrowserEvent.map; + map.requestRenderFrame(); + map.getView().setHint(ol.ViewHint.PANNING, 1); return true; } else { return false; diff --git a/src/ol/map.js b/src/ol/map.js index a617727b2e..300a09b015 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -585,6 +585,7 @@ ol.Map.prototype.renderFrame_ = function(time) { if (goog.isDef(layersArray) && goog.isDef(size) && goog.isDef(view2D) && view2D.isDef()) { var backgroundColor = this.getBackgroundColor(); + var viewHints = view.getHints(); var layerStates = {}; goog.array.forEach(layersArray, function(layer) { layerStates[goog.getUid(layer)] = layer.getLayerState(); @@ -601,6 +602,7 @@ ol.Map.prototype.renderFrame_ = function(time) { size: size, tileQueue: this.tileQueue_, view2DState: view2DState, + viewHints: viewHints, time: time }; } diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index db8698b086..79c4e755a4 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -14,6 +14,7 @@ goog.require('ol.Size'); goog.require('ol.TileCoord'); goog.require('ol.TileRange'); goog.require('ol.TileState'); +goog.require('ol.ViewHint'); goog.require('ol.dom'); goog.require('ol.renderer.dom.Layer'); goog.require('ol.tilegrid.TileGrid'); @@ -210,7 +211,10 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = goog.dom.insertChildAt(this.target, tileLayerZ.target, 0); } } else { - tileLayerZ.removeTilesOutsideExtent(frameState.extent); + if (!frameState.viewHints[ol.ViewHint.ANIMATING] && + !frameState.viewHints[ol.ViewHint.PANNING]) { + tileLayerZ.removeTilesOutsideExtent(frameState.extent); + } } } diff --git a/src/ol/view.js b/src/ol/view.js index b155d8ae15..27e0c9db1f 100644 --- a/src/ol/view.js +++ b/src/ol/view.js @@ -1,10 +1,21 @@ goog.provide('ol.View'); +goog.provide('ol.ViewHint'); +goog.require('goog.array'); goog.require('ol.IView'); goog.require('ol.IView2D'); goog.require('ol.IView3D'); +/** + * @enum {number} + */ +ol.ViewHint = { + ANIMATING: 0, + PANNING: 1 +}; + + /** * @constructor @@ -12,10 +23,25 @@ goog.require('ol.IView3D'); * @extends {ol.Object} */ ol.View = function() { + + /** + * @private + * @type {Array.} + */ + this.hints_ = [0, 0]; + }; goog.inherits(ol.View, ol.Object); +/** + * @return {Array.} Hint. + */ +ol.View.prototype.getHints = function() { + return goog.array.clone(this.hints_); +}; + + /** * @inheritDoc */ @@ -27,3 +53,13 @@ ol.View.prototype.getView2D = goog.abstractMethod; */ ol.View.prototype.getView3D = goog.abstractMethod; + +/** + * @param {ol.ViewHint} hint Hint. + * @param {number} delta Delta. + */ +ol.View.prototype.setHint = function(hint, delta) { + goog.asserts.assert(0 <= hint && hint < this.hints_.length); + this.hints_[hint] += delta; + goog.asserts.assert(this.hints_[hint] >= 0); +};