From 0b8deb11a25e16bb719b89c2580c44938bfd96ca Mon Sep 17 00:00:00 2001 From: ahocevar Date: Tue, 18 Dec 2012 13:12:00 +0100 Subject: [PATCH] Revert "No backbuffer removal delay needed with 3d enabled" This reverts commit 7e8271525ed52288092a135b1c65eed4849c8e49. --- lib/OpenLayers/Layer/Grid.js | 58 ++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/lib/OpenLayers/Layer/Grid.js b/lib/OpenLayers/Layer/Grid.js index 62bcd5c25e..b7101cec2c 100644 --- a/lib/OpenLayers/Layer/Grid.js +++ b/lib/OpenLayers/Layer/Grid.js @@ -190,15 +190,22 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { backBufferLonLat: null, /** - * APIProperty: removeBackBufferDelay - * {Number} Delay in ms for removing the backbuffer when all tiles have - * finished loading. Usually a value of 0 works fine. For slow mobile - * devices, when using layers with big image sizes, a delay - * of 40-50ms may help to avoid flickers after panning. Default is 0. - * If set, the layer's loadend event will also be delayed when a - * backbuffer needs to be removed. + * Property: backBufferTimerId + * {Number} The id of the back buffer timer. This timer is used to + * delay the removal of the back buffer, thereby preventing + * flash effects caused by tile animation. */ - removeBackBufferDelay: 0, + backBufferTimerId: null, + + /** + * APIProperty: removeBackBufferDelay + * {Number} Delay for removing the backbuffer when all tiles have finished + * loading. Can be set to 0 when no css opacity transitions for the + * olTileImage class are used. Default is 0 for layers, + * 2500 for tiled layers. See for more information on + * tile animation. + */ + removeBackBufferDelay: null, /** * APIProperty: className @@ -229,6 +236,8 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { * transition: opacity 0.2s linear; * } * (end) + * In that case, to avoid flash effects, + * should not be zero. */ className: null, @@ -302,6 +311,10 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { this.tileQueue = []; this._removeBackBuffer = OpenLayers.Function.bind(this.removeBackBuffer, this); + if (this.removeBackBufferDelay === null) { + this.removeBackBufferDelay = this.singleTile ? 0 : 2500; + } + if (this.className === null) { this.className = this.singleTile ? 'olLayerGridSingleTile' : 'olLayerGrid'; @@ -341,6 +354,10 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { this.moveTimerId = null; } this.clearTileQueue(); + if(this.backBufferTimerId !== null) { + window.clearTimeout(this.backBufferTimerId); + this.backBufferTimerId = null; + } }, /** @@ -409,6 +426,7 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { obj.gridResolution = null; // same for backbuffer and tile queue obj.backBuffer = null; + obj.backBufferTimerId = null; obj.tileQueue = []; obj.tileQueueId = null; obj.loading = false; @@ -668,6 +686,9 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { * resolution - {Number} The resolution to transition to. */ applyBackBuffer: function(resolution) { + if(this.backBufferTimerId !== null) { + this.removeBackBuffer(); + } var backBuffer = this.backBuffer; if(!backBuffer) { backBuffer = this.createBackBuffer(); @@ -757,6 +778,10 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { this.div.removeChild(this.backBuffer); this.backBuffer = null; this.backBufferResolution = null; + if(this.backBufferTimerId !== null) { + window.clearTimeout(this.backBufferTimerId); + this.backBufferTimerId = null; + } } }, @@ -1109,14 +1134,15 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, { }); //if that was the last tile, then trigger a 'loadend' on the layer if (this.tileQueue.length === 0 && this.numLoadingTiles === 0) { - if (this.backBuffer) { - var that = this; - window.setTimeout(function() { - that.onLoadEnd(); - that.removeBackBuffer(); - }, this.removeBackBufferDelay); - } else { - this.onLoadEnd(); + this.loading = false; + this.events.triggerEvent("loadend"); + if(this.backBuffer) { + // the removal of the back buffer is delayed to prevent flash + // effects due to the animation of tile displaying + this.backBufferTimerId = window.setTimeout( + OpenLayers.Function.bind(this.removeBackBuffer, this), + this.removeBackBufferDelay + ); } } };