探討Android ViewGroup(Layout)和View中onInterceptTouchEvent和onTouchEvent調用關係詳解

本帖記錄onInterceptTouchEvent和onTouchEvent調用關係,即各種return true和return false的運行情況。

return true和return false,代表的是是否消費完該事件,也就是該事件是否會繼續傳遞給下層或者上層組件繼續處理。return true代表消費完不會繼續傳遞,return false代表沒有消費完將會繼續傳遞。

如果沒有onInterceptTouchEvent,只考慮onTouchEvent的話,比較容易分析和理解。假如有三層佈局結構,linearLayout1,linearLayout2,textView,從前到後是包含的關係。那麼下面分情況說明。
1.如果它們的onTouchEvent都返回false的話,DOWN事件會自上而下(textView位於最上層)依次傳遞,最終都沒有消費完此事件,都只會進入onTouchEvent方法一次並且MotionEvent的action爲MotionEvent.ACTION_DOWN,move和up等事件不會繼續處理。
2.如果textView的onTouchEvent返回true,表示textView消費了此事件,不會傳給父組件linearLayout2和linearLayout1了,並且還會繼續處理move和up等事件。
3.linearLayout2和linearLayout1的onTouchEvent返回true和上面的情況一樣,都不會繼續傳給父容器而且本身繼續處理move和up等事件。
OK,這種情況還是比較容易理解的。

下面加入onInterceptTouchEvent。
onInterceptTouchEvent只有ViewGroup纔會有,用於在進入自身onTouchEvent或者子組件onTouchEvent之前處理事件。注意onTouch是自上而下傳遞,而onInterceptTouch卻是由下而上傳遞的。來了一個DOWN事件,首先進入的必然是最底層的viewGroup的onInterceptTouchEvent方法,然後根據return的值進入自身或者子組件的onTouch事件,當然如果子組件也是viewgroup的話,在進入子組件的onTouch之前也會進入子組件的onInterceptTouchEvent方法。
下面也分幾種情況介紹:
1.當onInterceptTouchEvent返回false時,表示沒有消費完此事件,會繼續傳遞個子組件的onTouch繼續處理。注意這種情況不會就不會傳遞給這個ViewGroup自身的onTouch事件處理了。這和onTouch如果返回false,後續的move、up等事件都不會繼續處理了可以做同樣理解。
2.當onInterceptTouchEvent返回true時,表示消費完此事件,或者說將在此組件上消費該事件。這種情況該事件會傳遞給ViewGroup自身的onTouch事件去處理,而不會傳遞給子組件的onTouch方法了。
由此可以總結,onInterceptTouchEvent返回值只是決定了是要把事件傳遞給自身的onTouch事件還是傳遞給子組件的onTouch事件。返回false表示沒有消費完將傳遞個子組件的onTouch方法,返回true表示自身消費此事件,將傳遞給自身的onTouch方法而不會傳遞給子組件的onTouch方法了。

上面內容是參考官方api和網上文檔以及自身做demo得出的,如果有什麼不對的地方還望指教。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章