とりあえず、動く現物は?といえば、ここのもので、こうした方がいいんじゃないの?とコメントを入れてみたが、コメントは消されてしまった。
まあ、あとでコメントした方法を自分で確かめてみたら、正しく動作しなかったので、ゴミコメントだと受け取られてしまったのかもしれない。一応、これで移動は、まともに動くようになりましたが、なんつう、やっつけ仕事…。
/* touch.js
* from: http://docs.opengeo.org/demo/OL/ (whit)
* cleaned up by: Anders Brownworth http://anders.com/
* ommented out "event.preventDefault()" for OpenLayers-PopUp-Feature support by: Julian from Germany
* fix move method by: miyuki oki
*/
TouchHandler = OpenLayers.Class( {
touchStartX: null,
touchStartY: null,
scale: 1,
skip:1,
limitPansPerMove: 2,
/*
* parameters
* limitPansPerMove - {Number} experimenting if we can less jerky panning by
* limiting the number of pan calls. the higher the number the more pan calls skipped.
*/
initialize: function( map, limitPansPerMove ) {
this.map = map;
console.log( "limitPansPerMove " + limitPansPerMove );
if ( limitPansPerMove ) {
console.log("no " + limitPansPerMove);
this.limitPansPerMove = limitPansPerMove;
}
// monkey-p map to include limitZoomOut
map.constructor.prototype['limitZoomOut'] = function( ) {
if ( this.getZoom( ) <= 2 ) {
return true;
}
return false;
};
this.hook_touch( map );
},
touchstart: function( ) {
var inDoubleTap = false;
var doubleTapTimer = false;
var zoom = null;
var obj = this;
return function ( event ) {
dec_debug(event);
//event.preventDefault( );
if ( event.touches.length == 1 ) {
if ( !doubleTapTimer ) {
doubleTapTimer = setTimeout( function( ) { inDoubleTap = false;
doubleTapTimer = false; },
500 );
}
if ( !inDoubleTap ) {
inDoubleTap = true;
}
else {
inDoubleTap = false;
var out = "out";
if ( zoom == null || zoom == out ) {
obj.map.zoomIn( );
zoom = "in";
}
else {
obj.map.zoomOut( );
zoom = out;
}
}
var touch = event.touches[0];
obj.touchStartX = touch.clientX;
obj.touchStartY = touch.clientY;
if ( touch.target.width === 128 ) {
return false;
}
else {
return true;
}
};
return null;
};
},
pan_touch: function ( ) {
var obj = this;
return function ( e ) {
dec_debug( event );
e.preventDefault( );
if ( e.touches.length == 1 ) {
var touch = e.touches[0];
//hack - limit number of calls to pan
//if ( obj.skip++ % obj.limitPansPerMove === 0 ) {
//obj.map.pan( obj.touchStartX - touch.clientX, obj.touchStartY - touch.clientY );
var deltaX = obj.touchStartX - touch.clientX;
var deltaY = obj.touchStartY - touch.clientY;
var size = obj.map.getSize();
var newXY = new OpenLayers.Pixel( size.w/2 + deltaX, size.h/2 + deltaY );
var newCenter = obj.map.getLonLatFromViewPortPx( newXY );
obj.map.setCenter(newCenter, null, true);
obj.touchStartX = touch.clientX;
obj.touchStartY = touch.clientY;
//}
}
};
},
zoom_guesture: function( ) {
var obj = this;
return function ( e ) {
dec_debug( event );
e.preventDefault( );
if ( e.scale > 1 && e.scale != obj.scale ) {
// if ( this.map.limitZoomIn( ) == false ) {
obj.map.zoomIn( );
// }
}
else {
if ( e.scale < 1 && e.scale != obj.scale ) {
if ( obj.map.limitZoomOut( ) == false ) {
obj.map.zoomOut( );
}
}
}
obj.scale = e.scale;
};
},
hook_touch: function ( ){
var map = this.map;
map.div.addEventListener("touchstart", this.touchstart(), false);
map.div.addEventListener("touchmove", this.pan_touch(), false);
map.div.addEventListener("touchend", this.zoom_guesture(), false);
map.div.addEventListener("guestureend", this.zoom_guesture(), false);
}
} );
// debugging
function repmsg( id, msg ) {
node = document.getElementById(id);
if ( node != null )
node.innerHTML = msg;
};
function dec_debug( event ) {
repmsg( 'debug', event.type + ' ' + xystr( event ) );
};
function xystr( event ) {
var coords = " ";
for ( i = 0; i < event.touches.length; i = i + 1 ) {
coords = coords + " x:" + event.touches[i].pageX + " y:" + event.touches[i].pageY;
};
coords = coords + " s:" + event.scale + " r:" + event.rotation;
return coords;
};
追伸:iPad の Safari では、一度ロードされた画像のメモリが解放されないという問題があり、touch どころの話ではないようだ。また、初期 Android では、マルチタッチに対応していないので、ML上でも拡大ができないと悲鳴が上がっていた。
0 件のコメント:
コメントを投稿