Merge pull request #47 from elemoine/pinchzoom

fix bug where center of fingers is not preserved on pinch zoom
This commit is contained in:
Éric Lemoine
2011-11-14 00:44:22 -08:00
2 changed files with 17 additions and 16 deletions
+16 -15
View File
@@ -22,10 +22,10 @@ OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
type: OpenLayers.Control.TYPE_TOOL, type: OpenLayers.Control.TYPE_TOOL,
/** /**
* Property: containerOrigin * Property: containerCenter
* {Object} Cached object representing the layer container origin (in pixels). * {Object} Cached object representing the layer container center (in pixels).
*/ */
containerOrigin: null, containerCenter: null,
/** /**
* Property: pinchOrigin * Property: pinchOrigin
@@ -76,10 +76,10 @@ OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
var activated = OpenLayers.Control.prototype.activate.apply(this,arguments); var activated = OpenLayers.Control.prototype.activate.apply(this,arguments);
if (activated) { if (activated) {
this.map.events.on({ this.map.events.on({
moveend: this.updateContainerOrigin, moveend: this.updateContainerCenter,
scope: this scope: this
}); });
this.updateContainerOrigin(); this.updateContainerCenter();
} }
return activated; return activated;
}, },
@@ -95,7 +95,7 @@ OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
var deactivated = OpenLayers.Control.prototype.deactivate.apply(this,arguments); var deactivated = OpenLayers.Control.prototype.deactivate.apply(this,arguments);
if (this.map && this.map.events) { if (this.map && this.map.events) {
this.map.events.un({ this.map.events.un({
moveend: this.updateContainerOrigin, moveend: this.updateContainerCenter,
scope: this scope: this
}); });
} }
@@ -103,14 +103,15 @@ OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
}, },
/** /**
* Method: updateContainerOrigin * Method: updateContainerCenter
* Must be called each time the layer container origin changes. * Must be called each time the layer container moves.
*/ */
updateContainerOrigin: function() { updateContainerCenter: function() {
var container = this.map.layerContainerDiv; var container = this.map.layerContainerDiv;
this.containerOrigin = { // the layer container div is a square of 100px/100px
x: parseInt(container.style.left, 10), this.containerCenter = {
y: parseInt(container.style.top, 10) x: parseInt(container.style.left, 10) + 50,
y: parseInt(container.style.top, 10) + 50
}; };
}, },
@@ -137,12 +138,12 @@ OpenLayers.Control.PinchZoom = OpenLayers.Class(OpenLayers.Control, {
*/ */
pinchMove: function(evt, pinchData) { pinchMove: function(evt, pinchData) {
var scale = pinchData.scale; var scale = pinchData.scale;
var containerOrigin = this.containerOrigin; var containerCenter = this.containerCenter;
var pinchOrigin = this.pinchOrigin; var pinchOrigin = this.pinchOrigin;
var current = evt.xy; var current = evt.xy;
var dx = Math.round((current.x - pinchOrigin.x) + (scale - 1) * (containerOrigin.x - pinchOrigin.x)); var dx = Math.round((current.x - pinchOrigin.x) + (scale - 1) * (containerCenter.x - pinchOrigin.x));
var dy = Math.round((current.y - pinchOrigin.y) + (scale - 1) * (containerOrigin.y - pinchOrigin.y)); var dy = Math.round((current.y - pinchOrigin.y) + (scale - 1) * (containerCenter.y - pinchOrigin.y));
this.applyTransform( this.applyTransform(
"translate(" + dx + "px, " + dy + "px) scale(" + scale + ")" "translate(" + dx + "px, " + dy + "px) scale(" + scale + ")"
+1 -1
View File
@@ -49,7 +49,7 @@
log.push(transform); log.push(transform);
} }
control.containerOrigin = { control.containerCenter = {
x: 0, y: 0 x: 0, y: 0
}; };