Я пытался сделать VEMap Bing Maps совместимым с сенсорными устройствами, в частности с iphone / webkit mobile.
В следующем примере это работает: - панорамирование одним пальцем - увеличение / уменьшение с помощью пинча(два пальца)
Однако, если я поместил оба в одно и то же время, то масштабирование больше не работает: в консоли вы можете видеть, как вызываются VEMap.ZoomIn () или VEMap.ZoomOut ()но ничего не происходит (без ошибок, исключений или чего-либо, просто ничего не происходит).
Скорее всего, существует решение, учитывая, что http://www.bing.com/maps прекрасно обрабатывает как прикосновения, так и жесты, но этот кодсжатый, так что я до сих пор в тупике, так что любая идея будет огромной помощью.
<!DOCTYPE html>
<html>
<head>
<title>VEMap</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.3&mkt=en-us"></script>
</head>
<body onload="init()">
<div id="mymap" style="position: relative; width: 256px; height: 256px;"></div>
<script type="text/javascript">
// Reference to the VEMap
var map = null;
// Whether a gesture is being performed currently or not.
var gesture = false;
// Translates touch event names into similar mouse event names
var touch2mouse = {"touchstart": "mousedown", "touchmove": "mousemove", "touchend": "mouseup"};
// Initializes the map and adds the touch/gesture listeners
function init(){
map = new VEMap('mymap');
map.HideDashboard();
map.LoadMap(new VELatLong(51.64, -0.18), 9, VEMapStyle.Road);
if (typeof Touch == "object"){
// Zooms the map using touch-pinch
document.addEventListener("gesturestart", ongesture, true);
document.addEventListener("gesturechange", ongesture, true);
document.addEventListener("gestureend", ongesture, true);
// Pans the map using touch-drag
// If you comment out these three lines, pinch-zoom works :(
document.addEventListener("touchstart", ontouch, true);
document.addEventListener("touchmove", ontouch, true);
document.addEventListener("touchend", ontouch, true);
}
}
// One finger interaction
function ontouch(e){
var touches = e.changedTouches;
if ((!gesture) && (touches.length == 1)){
if (e.type == "touchmove") e.preventDefault();
var obj = touches[0];
var e2 = document.createEvent("MouseEvent");
e2.initMouseEvent(touch2mouse[e.type], true, true, window, 1, obj.screenX, obj.screenY, obj.clientX, obj.clientY, false, false, false, false, 0, null);
obj.target.dispatchEvent(e2);
}
}
// Two fingers interaction
function ongesture(e){
e.preventDefault();
switch(e.type){
case "gesturestart":
gesture = true;
break;
case "gestureend":
gesture = false;
if (e.scale > 1.2){
console.log('Attempting to zoom IN.');
map.ZoomIn();
} else if (e.scale < 0.8){
map.ZoomOut();
console.log('Attempting to zoom OUT.');
}
break;
}
}
</script>
</body>
</html>