Skip to content

Instantly share code, notes, and snippets.

@enru
Created April 6, 2011 10:51
Show Gist options
  • Select an option

  • Save enru/905463 to your computer and use it in GitHub Desktop.

Select an option

Save enru/905463 to your computer and use it in GitHub Desktop.
touch handler for openlayers maps
/*
* touch handler for openlayers maps on mobile
* see: http://www.openlayers.org/
*/
var map = {} // dummy object -> create & init an openlayers map
Touch = (function() { return {
startX: 0,
startY: 0,
zooming: false,
moving: false,
Handler: function(event) {
var touch = event.changedTouches[0];
// bubbling
switch (event.type) {
case "touchstart":
Touch.startX = touch.clientX
Touch.startY = touch.clientY
break;
case "touchmove":
event.preventDefault() // stop dragging on ipad
Touch.zooming = (event.touches.length > 1)
Touch.moving = (event.touches.length == 1)
break;
case "touchend":
if(Touch.zooming) {
event.preventDefault()
// todo - better calc for centre of zoom pinch
var pos = OpenLayers.Util.pagePosition(map.div);
var newX = Touch.startX - pos[0]
var newY = Touch.startY - pos[1]
var newCenter = map.getLonLatFromViewPortPx( {x: newX, y: newY} );
map.setCenter(newCenter)
if(event.scale < 1) map.zoomOut()
else map.zoomIn()
Touch.zooming = false
}
else if(Touch.moving) {
event.preventDefault()
var center = map.getViewPortPxFromLonLat(map.getCenter());
var pos = OpenLayers.Util.pagePosition(map.div);
panX = touch.clientX - pos[0]
panY = touch.clientY - pos[1]
Touch.startX -= pos[0]
Touch.startY -= pos[1]
panX = center.x + (Touch.startX - panX)
panY = center.y + (Touch.startY - panY)
var newCenter = map.getLonLatFromViewPortPx( {x: panX, y: panY} );
map.setCenter(newCenter)
Touch.moving = false
}
break;
default:
break;
}
} // end Handler
}})()
map.div.ontouchstart = Touch.Handler;
map.div.ontouchmove = Touch.Handler;
map.div.ontouchend = Touch.Handler;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment