2011-01-26 73 views
11

我在一個活動中有一個MapView,它工作正常,地圖顯示,它響應點擊,並且我可以輕鬆地提取位置。然而,這個處理程序也響應捏縮放,所以如果用戶試圖捏縮放,應用程序響應,就好像他們挖掘(這是他們非常困惑)。如何響應Android MapView上的水龍頭,但忽略捏縮放?

如何響應MapView上的水龍頭,只拾取單擊,特別是忽略捏縮放和雙擊?

我是否需要使用OnTouchEvent()而不是OnTap()?如果是這樣,我如何區分不同的觸摸事件,以及如何訪問GeoPoint?

下面的代碼從我MapActivity內:

class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean onTap(GeoPoint p, MapView map) 
    { 
     if (p!=null) 
     { 
      // Do stuff with the geopoint 
      return true;         // We handled the tap 
     } 
     else 
     { 
      return false;        // We didn't handle the tap 
     } 
    } 
} 
+0

時覆蓋項目被竊聽(相對於地圖的任意位置),並且還設置了觸摸監聽器上的MapView忽略捏,像你也許能夠使用中的onTap,其目的是隻響應不斷這個:http://stackoverflow.com/questions/4626028/how-to-disable-pinch-in-android-mapview – 2011-01-26 16:33:12

+0

有趣的是拖動地圖是好的。所以拖動不會觸發onTap(),但點擊確實(如預期),但也捏和縮放。這不是我所期望的。 – 2011-01-27 19:17:03

回答

27

經過一番頭刮傷和嘗試不同的方法,這是一個至今運作良好。代碼遵循動作事件。當我們得到一個ACTION_DOWN事件時,它將isPinch標誌標記爲false(我們不知道它是否是一個捏),但是一旦我們得到涉及兩個手指的觸摸事件(即ACTION_MOVE),isPinch被設置爲true,所以當onTap()事件觸發時,它可以看到是否存在夾點。

class MapOverlay extends com.google.android.maps.Overlay 
{ 
private boolean isPinch = false; 

@Override 
public boolean onTap(GeoPoint p, MapView map){ 
    if (isPinch){ 
     return false; 
    }else{ 
     Log.i(TAG,"TAP!"); 
     if (p!=null){ 
      handleGeoPoint(p); 
      return true;   // We handled the tap 
     }else{ 
      return false;   // Null GeoPoint 
     } 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent e, MapView mapView) 
{ 
    int fingers = e.getPointerCount(); 
    if(e.getAction()==MotionEvent.ACTION_DOWN){ 
     isPinch=false; // Touch DOWN, don't know if it's a pinch yet 
    } 
    if(e.getAction()==MotionEvent.ACTION_MOVE && fingers==2){ 
     isPinch=true; // Two fingers, def a pinch 
    } 
    return super.onTouchEvent(e,mapView); 
} 

}