2010-09-08 117 views
6

我試圖在MapView中實現雙擊縮放功能。事件總是首次發生,但從未發生過。以下是我的代碼。我有一種感覺,它與第一次事件發生後地圖控制器迷路有關。MapView中的OnTouch僅第一次觸發

import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 

public class mainmap extends MapActivity implements OnTouchListener{ 

    long lasttime = -1; 
    MapController mapc; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     MapView mapView = (MapView) findViewById(R.id.mapview); 
     mapView.setBuiltInZoomControls(true); 
     mapc = mapView.getController(); 
     mapView.setOnTouchListener(this);  
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

      if(event.getEventTime()-lasttime<2000){ 
       mapc.zoomInFixing((int)event.getX(),(int)event.getY());    
      } 
     }  
     lasttime=event.getEventTime(); 
     return true; 
    } 

    } 

我也嘗試編輯OnTouch方法來將傳入視圖強制轉換爲MapView,在事件被觸發時獲取控制器。但是,在第一個事件被解僱的情況下,我得到了相同的結果,但沒有後續的結果。

public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

      if(event.getEventTime()-lasttime<2000){ 
       ((MapView)v).getController().zoomInFixing((int)event.getX(), (int)event.getY());     
      } 
     }  
     lasttime=event.getEventTime(); 
     return true; 
    } 

儘量保持基本,我將OnTouch方法中的所有代碼剪掉,並將其編程爲僅顯示一條小吐司消息。

public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

       Toast.makeText(this,"Down!",Toast.LENGTH_SHORT).show(); 

     }  

     return true; 
} 

這樣按預期工作,每次觸摸MapView時都會顯示Toast。

我不明白爲什麼事件會在這種情況下正確觸發,但不是在我以前的實施。

回答

0

如何使用GestureDetector.OnDoubleTapListener而不是OnTouchListener

+0

感謝您的建議。我會嘗試實現一個OnDoubleTapListener來處理這個功能。 雖然我仍然感到困惑。 我明白OnDoubleTapListener可能是處理這個問題的最好方法,但我發佈的理論代碼應該可行,對不對? – amandion 2010-09-08 14:05:12

0

你至少應該把

lasttime=event.getEventTime(); 

if (event.getAction() == MotionEvent.ACTION_DOWN) brakes 

onTouch檢測ACTION_UP事件的點擊。所以任何時候你點擊它被稱爲2次

1

我有同樣的問題 - 我不能拖動和滾動地圖,因爲它只收到ACTION_DOWN事件。可以通過將android:clickable="true"添加到MapView或致電mapView.setClickable(true)來解決。

+0

不,OnTouchListener + OnClickListener不工作:( – djdance 2015-06-14 21:45:53

15

如果您正在使用此方法"mapView.setBuiltInZoomControls(true);",那麼您的touch正在同時運行。

請刪除該行並檢查我相信它會運行

在某些情況下,如果你想BuiltInZoomControls那麼你可以在你喜歡覆蓋下面的OnTouch方法..

public class MapOverlay extends Overlay { 

    public MapOverlay(Context ctx) {super(ctx);} 

    @Override 
    protected void draw(Canvas c, MapView osmv, boolean shadow) { } 

    @Override 
    public boolean onTouchEvent(MotionEvent e, MapView mapView) { 
     //Write yout touch code here.. 
     return false; 
    } 
} 
+0

這是真的,但爲什麼觸摸事件調用一次? – Nik 2012-05-24 12:43:14

+0

我沒有浪費我的時間在上面,所以我不知道它。我認爲沒有必要builtInZoom Button bcz map已經支持多點觸控縮放功能,您還可以添加自定義按鈕來放大/縮小.. – 2012-05-24 13:00:18

+0

Overlay類與這個問題相關的問題 - 地圖視圖和縮放控件? – Ixx 2012-11-14 13:37:28

-1

改爲在地圖視圖上實施Touch事件。那可行!!

// The onTouch event of the Map itself does not fire! 
    // We must implement it on the mapView!!! 
    mapView.setOnTouchListener(new OnTouchListener() 
    { 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      // Your code and remember to return true!     

      return (true); 
     } 
    }); 
+0

does not work dude – Nezam 2014-05-02 01:24:01

1

子類MapView和重寫像下面的dispatchTouchEvent並使用子類代替。

public class MyMap extends MapView{ 
@Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     if (mOnMovedListener!= null) { 
       mOnMovedListener.onMove(ev); 
      } 
      return super.dispatchTouchEvent(ev); 
     } 
    private OnMovedListener mOnMovedListener; 

    public void setOnMovedListener(OnMovedListener mOnMovedListener) { 
     this.mOnMovedListener= mOnMovedListener; 
    } 
} 

註冊聽衆像任何其他!

相關問題