2011-10-10 67 views
0

我工作的一個谷歌地圖應用程序,其中用戶可觸摸地圖和標記在地圖上起點和終點。然後連接兩個點的路徑在地圖上繪製。 爲了處理觸摸事件,我在MapOverlay類中實現了onTouchEvent方法。 我觀察到一些奇怪的行爲與地圖。當用戶獲得連接兩個點的路徑時,地圖凍結,即我無法平移或縮放地圖。 我發現,如果返回值是真的onTouchEvent這是MapOverlay方法內的內部在上述地圖凍結所述情節。如果我返回false,那麼地圖不會凍結。但是,如果我想再次在地圖上標記新的點,應用程序崩潰... onTouchEvent的返回值如何與此行爲相關?爲什麼onTouchEvent的返回值會使應用程序崩潰或凍結mapView?

回答

1

如果返回true,處理程序告訴系統,它處理的的onTouchEvent,系統不會調用另一個onTouchListener。如果你返回false,你告訴系統,你沒有處理觸摸事件,它會調用底層視圖的onTouchListener。你的地圖不會凍結,但它沒有得到任何觸摸事件,因爲你的處理器處理它們。

+0

所以,現在我明白了地圖沒有註冊任何觸摸事件,因此沒有響應。我該如何解決這個問題?我希望地圖能夠在地圖上繪製路徑之後註冊觸摸事件。 –

+0

爲什麼不在你的EventListener中返回false,並在返回之前執行你想要做的功能? –

+0

我發現默認情況下我在onTouchEvent的最後返回true。所以處理程序假設事件正在處理,無論如何。問題現在已解決。謝謝。 –

1

即使作品onTouchEvent()的方式是如果你返回true,這意味着觸摸事件被處理,Android不會繼續沿視圖層次結構處理觸摸事件。如果你返回false,它將繼續。

在這種情況下,當你總是返回true,你總是說,觸摸事件已處理。因此,你做的任何手勢都不會被處理,因爲你說它已經被處理了。因此,它看起來像地圖凍結。相反,把這樣一個條件:

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    boolean wasHandled = false; 
    if(/* condition where your touch event was handled */) 
     wasHandled = true; 
    else 
     wasHandled = super.onTouchEvent(event); 

    return wasHandled; 
} 

,當你返回false崩潰或者是在你的程序有問題,或者進入一個循環,因爲該事件的處理從來沒有的原因。

+0

我根據條件返回了true或false,而不是真正的返回,並且我的問題得到解決。謝謝。 –

相關問題