View嵌套的時候, Touch事件的傳遞, 常常讓人頭疼.
spa
好比在ScrollView裏, 在WebView裏, 在ListView裏. 事件的傳遞的結果會讓你以爲"這太靈異了!"事件
麻煩的代碼就不說了,若是隻作上層App, 那也只有爲數很少的幾個方法可讓咱們處理這些靈異問題:ci
onTouchEvent(), dispatchTouchEvent(), onInterceptTouchEvent().it
而且處理的方案, 也只有控制他們的返回值.List
這三個方法的返回值, 意義各不相同:
方法
onTouchEvent(): di
true: "我處理了這個事件, 而且與我在同一個ViewGroup下的其餘View將不能再處理這個事件"vi
false:"我處理了這個事件, 而且與我在同一個ViewGroup下的其餘View能夠繼續處理這個事件"工作
dispatchTouchEvent()控件
true: "我對這個事件(一般是Down事件)感興趣, 我將在onTouchEvent中處理這個事件"
false: "我對這個事件沒興趣, 我不會處理這個事件以及以後與這個事件相關的move, up事件"
onInterceptTouchEvent
這方法是ViewGroup的方法,
true: "個人子View將不能處理這個事件, 不會調用子View的onTouchEvent"
fasle: "個人子View能夠繼續處理這個事件, 我會將事件傳遞給子View"
如此. 基本引發靈異事件的就這仨方法了.
當發現onTouch不能工做, 檢查一下View的dispatchTouchEvent是否返回了false, 或者檢查一下父View的onInterceptTouchEvent是否返回了true. 固然Acitivity也是有這幾個方法, 同樣須要檢查.
改的時候也要特別當心, 由於各類本身定義的控件, 都對相應的Touch事件有特殊處理, 因此要當心驗證重寫相關方法後是否會影響相關邏輯.