move pan animation code into Map.js
This commit is contained in:
parent
5110298c45
commit
ff73971294
@ -19,7 +19,9 @@ var deps = {
|
|||||||
'geo/crs/CRS.EPSG3857.js',
|
'geo/crs/CRS.EPSG3857.js',
|
||||||
'geo/crs/CRS.EPSG4326.js',
|
'geo/crs/CRS.EPSG4326.js',
|
||||||
'map/Map.js',
|
'map/Map.js',
|
||||||
'layer/Layer.js'
|
'layer/Layer.js',
|
||||||
|
'dom/DomEvent.js',
|
||||||
|
'dom/PosAnimation.js'
|
||||||
],
|
],
|
||||||
desc: 'The core of the library, including OOP, events, DOM facilities, basic units, projections (EPSG:3857 and EPSG:4326) and the base Map class.'
|
desc: 'The core of the library, including OOP, events, DOM facilities, basic units, projections (EPSG:3857 and EPSG:4326) and the base Map class.'
|
||||||
},
|
},
|
||||||
@ -234,9 +236,6 @@ var deps = {
|
|||||||
|
|
||||||
AnimationPan: {
|
AnimationPan: {
|
||||||
src: [
|
src: [
|
||||||
'dom/DomEvent.js',
|
|
||||||
'dom/PosAnimation.js',
|
|
||||||
'map/anim/Map.PanAnimation.js'
|
|
||||||
],
|
],
|
||||||
heading: 'Animation',
|
heading: 'Animation',
|
||||||
desc: 'Core panning animation support.'
|
desc: 'Core panning animation support.'
|
||||||
@ -246,7 +245,6 @@ var deps = {
|
|||||||
src: [
|
src: [
|
||||||
'map/anim/Map.ZoomAnimation.js'
|
'map/anim/Map.ZoomAnimation.js'
|
||||||
],
|
],
|
||||||
deps: ['AnimationPan'],
|
|
||||||
desc: 'Smooth zooming animation. Works only on browsers that support CSS3 Transitions.'
|
desc: 'Smooth zooming animation. Works only on browsers that support CSS3 Transitions.'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -137,10 +137,36 @@ L.Map = L.Evented.extend({
|
|||||||
// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this
|
// @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this
|
||||||
// Sets the view of the map (geographical center and zoom) with the given
|
// Sets the view of the map (geographical center and zoom) with the given
|
||||||
// animation options.
|
// animation options.
|
||||||
setView: function (center, zoom) {
|
setView: function (center, zoom, options) {
|
||||||
// replaced by animation-powered implementation in Map.PanAnimation.js
|
|
||||||
zoom = zoom === undefined ? this.getZoom() : zoom;
|
zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
|
||||||
this._resetView(L.latLng(center), zoom);
|
center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
this._stop();
|
||||||
|
|
||||||
|
if (this._loaded && !options.reset && options !== true) {
|
||||||
|
|
||||||
|
if (options.animate !== undefined) {
|
||||||
|
options.zoom = L.extend({animate: options.animate}, options.zoom);
|
||||||
|
options.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan);
|
||||||
|
}
|
||||||
|
|
||||||
|
// try animating pan or zoom
|
||||||
|
var moved = (this._zoom !== zoom) ?
|
||||||
|
this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :
|
||||||
|
this._tryAnimatedPan(center, options.pan);
|
||||||
|
|
||||||
|
if (moved) {
|
||||||
|
// prevent resize handler call, the view will refresh after animation anyway
|
||||||
|
clearTimeout(this._sizeTimer);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// animation didn't start, just reset the map view
|
||||||
|
this._resetView(center, zoom);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -239,14 +265,46 @@ L.Map = L.Evented.extend({
|
|||||||
|
|
||||||
// @method panBy(offset: Point): this
|
// @method panBy(offset: Point): this
|
||||||
// Pans the map by a given number of pixels (animated).
|
// Pans the map by a given number of pixels (animated).
|
||||||
panBy: function (offset) { // (Point)
|
panBy: function (offset, options) {
|
||||||
// replaced with animated panBy in Map.PanAnimation.js
|
offset = L.point(offset).round();
|
||||||
this.fire('movestart');
|
options = options || {};
|
||||||
|
|
||||||
this._rawPanBy(L.point(offset));
|
if (!offset.x && !offset.y) {
|
||||||
|
|
||||||
this.fire('move');
|
|
||||||
return this.fire('moveend');
|
return this.fire('moveend');
|
||||||
|
}
|
||||||
|
// If we pan too far, Chrome gets issues with tiles
|
||||||
|
// and makes them disappear or appear in the wrong place (slightly offset) #2602
|
||||||
|
if (options.animate !== true && !this.getSize().contains(offset)) {
|
||||||
|
this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._panAnim) {
|
||||||
|
this._panAnim = new L.PosAnimation();
|
||||||
|
|
||||||
|
this._panAnim.on({
|
||||||
|
'step': this._onPanTransitionStep,
|
||||||
|
'end': this._onPanTransitionEnd
|
||||||
|
}, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't fire movestart if animating inertia
|
||||||
|
if (!options.noMoveStart) {
|
||||||
|
this.fire('movestart');
|
||||||
|
}
|
||||||
|
|
||||||
|
// animate pan unless animate: false specified
|
||||||
|
if (options.animate !== false) {
|
||||||
|
L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');
|
||||||
|
|
||||||
|
var newPos = this._getMapPanePos().subtract(offset).round();
|
||||||
|
this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);
|
||||||
|
} else {
|
||||||
|
this._rawPanBy(offset);
|
||||||
|
this.fire('move').fire('moveend');
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this
|
// @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this
|
||||||
@ -1369,6 +1427,27 @@ L.Map = L.Evented.extend({
|
|||||||
zoom = Math.round(zoom / snap) * snap;
|
zoom = Math.round(zoom / snap) * snap;
|
||||||
}
|
}
|
||||||
return Math.max(min, Math.min(max, zoom));
|
return Math.max(min, Math.min(max, zoom));
|
||||||
|
},
|
||||||
|
|
||||||
|
_onPanTransitionStep: function () {
|
||||||
|
this.fire('move');
|
||||||
|
},
|
||||||
|
|
||||||
|
_onPanTransitionEnd: function () {
|
||||||
|
L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');
|
||||||
|
this.fire('moveend');
|
||||||
|
},
|
||||||
|
|
||||||
|
_tryAnimatedPan: function (center, options) {
|
||||||
|
// difference between the new and current centers in pixels
|
||||||
|
var offset = this._getCenterOffset(center)._floor();
|
||||||
|
|
||||||
|
// don't animate too far unless animate: true specified in options
|
||||||
|
if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
|
||||||
|
|
||||||
|
this.panBy(offset, options);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,102 +0,0 @@
|
|||||||
/*
|
|
||||||
* Extends L.Map to handle panning animations.
|
|
||||||
*/
|
|
||||||
|
|
||||||
L.Map.include({
|
|
||||||
|
|
||||||
setView: function (center, zoom, options) {
|
|
||||||
|
|
||||||
zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
|
|
||||||
center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
this._stop();
|
|
||||||
|
|
||||||
if (this._loaded && !options.reset && options !== true) {
|
|
||||||
|
|
||||||
if (options.animate !== undefined) {
|
|
||||||
options.zoom = L.extend({animate: options.animate}, options.zoom);
|
|
||||||
options.pan = L.extend({animate: options.animate, duration: options.duration}, options.pan);
|
|
||||||
}
|
|
||||||
|
|
||||||
// try animating pan or zoom
|
|
||||||
var moved = (this._zoom !== zoom) ?
|
|
||||||
this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :
|
|
||||||
this._tryAnimatedPan(center, options.pan);
|
|
||||||
|
|
||||||
if (moved) {
|
|
||||||
// prevent resize handler call, the view will refresh after animation anyway
|
|
||||||
clearTimeout(this._sizeTimer);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// animation didn't start, just reset the map view
|
|
||||||
this._resetView(center, zoom);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
panBy: function (offset, options) {
|
|
||||||
offset = L.point(offset).round();
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
if (!offset.x && !offset.y) {
|
|
||||||
return this.fire('moveend');
|
|
||||||
}
|
|
||||||
// If we pan too far, Chrome gets issues with tiles
|
|
||||||
// and makes them disappear or appear in the wrong place (slightly offset) #2602
|
|
||||||
if (options.animate !== true && !this.getSize().contains(offset)) {
|
|
||||||
this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom());
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this._panAnim) {
|
|
||||||
this._panAnim = new L.PosAnimation();
|
|
||||||
|
|
||||||
this._panAnim.on({
|
|
||||||
'step': this._onPanTransitionStep,
|
|
||||||
'end': this._onPanTransitionEnd
|
|
||||||
}, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// don't fire movestart if animating inertia
|
|
||||||
if (!options.noMoveStart) {
|
|
||||||
this.fire('movestart');
|
|
||||||
}
|
|
||||||
|
|
||||||
// animate pan unless animate: false specified
|
|
||||||
if (options.animate !== false) {
|
|
||||||
L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');
|
|
||||||
|
|
||||||
var newPos = this._getMapPanePos().subtract(offset).round();
|
|
||||||
this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);
|
|
||||||
} else {
|
|
||||||
this._rawPanBy(offset);
|
|
||||||
this.fire('move').fire('moveend');
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onPanTransitionStep: function () {
|
|
||||||
this.fire('move');
|
|
||||||
},
|
|
||||||
|
|
||||||
_onPanTransitionEnd: function () {
|
|
||||||
L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');
|
|
||||||
this.fire('moveend');
|
|
||||||
},
|
|
||||||
|
|
||||||
_tryAnimatedPan: function (center, options) {
|
|
||||||
// difference between the new and current centers in pixels
|
|
||||||
var offset = this._getCenterOffset(center)._floor();
|
|
||||||
|
|
||||||
// don't animate too far unless animate: true specified in options
|
|
||||||
if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
|
|
||||||
|
|
||||||
this.panBy(offset, options);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
Loading…
Reference in New Issue
Block a user