1. 程式人生 > >自定義ViewGroup和View的MotionEvent的關係

自定義ViewGroup和View的MotionEvent的關係

當TouchEvent發生時,首先Activity將TouchEvent傳遞給最頂層的ViewGroup, TouchEvent最先到達最頂層 viewGroup 的 dispatchTouchEvent ,然後由  dispatchTouchEvent 方法進行分發,如果dispatchTouchEvent返回true ,則交給這個viewGroup 的onTouchEvent處理,如果dispatchTouchEvent返回 false ,則交給這個 viewGroup 的 interceptTouchEvent 方法來決定是否要攔截這個事,如果 interceptTouchEvent 返回 true ,也就是攔截掉了,則交給它的 onTouchEvent 來處理,如果 interceptTouchEvent 返回 false ,那麼就傳遞給子 view ,由子 view 的 dispatchTouchEvent 再來開始這個事件的分發。如果事件傳遞到某一層的子 view 的 onTouchEvent 上了,這個方法返回了 false ,那麼這個事件會從這個 view 往上傳遞,都是 onTouchEvent 來接收。而如果傳遞到最上面的 onTouchEvent 也返回 false 的話,這個事件就會“消失”,而且接收不到下一次事件。


佈局檔案最底層(先後順序)

ViewGroup:

dispatchTouchEvent 分發觸控事件,如果return true ,後面onInterceptTouchEvent onTouch包括上層View的Touch都不會觸發。

return false,後面onInterceptTouchEvent onTouch包括上層View的Touch也都不會觸發。

return super..後續可以觸發。


onInterceptTouchEvent 攔截觸控事件,如果return true ,view中Touch不會觸發,只觸發ViewGroup中的onTouch事件;

return false,view中的onTouch觸發,不觸發ViewGroup的onTouch;

                                                      

return super.... ,點選View上的時候,觸發View中的onTouch()(所有事件down,up,move);(OnTouch返回的是super)點選Viewgroup上的觸發ViewGroup上的onTouch()只一次down事件。

onTouch觸發事件 當onInterceptTouchEvent返回true,同下;

    當onInterceptTouchEvent返回super....,如果return true,down,up,move等都會觸發(onInterceptTouchEvent只觸發down事件)

如果return false,同下;

如果return super....,只觸發down,不往下傳

View中沒有onInterceptTouchEvent 方法。view中觸發onTouch都會觸發ViewGroup中的dispatchTouchEvent ,onInterceptTouchEvent 。