2011-01-21 85 views
0

我正在開發一個使用MapView的Android應用程序。我希望在地圖的可見部分發生變化(由於縮放/平移/旋轉電話等)時運行程序,並且我想將新的緯度和經度值傳遞給程序。確定MapView Lat/Lon窗口何時更改的正確方法是什麼?

我以爲我可以覆蓋onInterceptTouchEvent來做到這一點,但這個過程似乎只在您第一次觸摸屏幕時運行(所以,例如,通過拖動手指進行平移只會在拖動動作開始時調用過程)。這意味着程序不會被新座標調用。

那麼 - 正確的方法是什麼?

回答

2

你可能必須結合幾種技術來實現你想要的。

爲了捕捉平移,我會嘗試覆蓋您的MapViews onTouchEvent()或者dispatchTouchEvent(),並偵聽MotionEvent.ACTION_UP事件。

public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction()==MotionEvent.ACTION_UP) { 
    // Call your procedure here 
    } 

    return super.onTouchEvent(ev); 
} 

如果你想在掃視期間打電話給你的方法,我認爲你必須去尋找平移運動覆蓋兩個相同的方法之一:當用戶從屏幕上擡起手指,這是觸發。事情是這樣的:

public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_MOVE) { 
    if (event.getHistorySize() < 1) 
     return; // First call, no history 

    // Get difference in position since previous move event 
    float diffX = event.getX() - event.getHistoricalX(event.getHistorySize() - 1); 
    float diffY = event.getY() - event.getHistoricalY(event.getHistorySize() - 1); 

    if (Math.abs(diffX) > 0.5f || Math.abs(diffY) > 0.5f) { 
     /* Position has changed substantially, so this is probably a drag action. 
     Call your procedure here. */ 
    } 
    } 
} 

爲了檢測變焦水平的變化可以覆蓋dispatchDraw:

int oldZoomLevel=-1; 

public void dispatchDraw(Canvas canvas) { 
    super.dispatchDraw(canvas); 

    if (getZoomLevel() != oldZoomLevel) { 
    // Call your procedure here 

    oldZoomLevel = getZoomLevel(); 
    } 
} 
+0

看起來這應該是一個內置的事件,但我想我會處理一些生活他們..謝謝! – Mzzzzzz

相關問題