讀《android開發藝術探索》筆記一:View的事件分發機制
View的事件分發機制:對於一個根viewgroup來說,點選事件產生後,首先會傳遞給它,這是它的dispatchTouchEvent就會被呼叫,如果這個viewGroup的OnInterceptTouchEvent方法返回true就表示它要攔截當前事件,接著事件就會交給這個viewGroup處理,即它的onTouchEvent方法就會被呼叫;如果這個ViewGroup的OnInterceptTouchEvent方法返回false就表示它不攔截當前事件,這時當前事件就會繼續傳遞給它的子元素,接著子元素的dispatchTouchEvent方法就會被呼叫,如此反覆直到事件被最終處理。
當一個View需要處理事件時,如果它設定了OnTouchListener,那麼OnTouchListener中的onTouch方法會被回撥。這時事件如何處理還要看onTouch的返回值,如果返回false,則當前view的onTouchEvent方法會被呼叫,反之不呼叫。由此可見,給view設定的OnTouchListener,其優先順序比onTouchEvent要高,在onTouchEvent方法中,如果當前設定的有OnClickListener,那麼它的onClick方法會被呼叫。可以看出,平時我們常用的OnClicKListener,其優先順序最低,即處於時間傳遞的尾端。
一個點選事件的產生,它的傳遞過程遵循如下順序:activity->window->view,事件總是先傳遞給activity,activity再傳遞給windows,最後windwos再傳遞給頂級view。換個思路,假設一個事件是一個難題,這個難題最終被上級領導分給了一個程式設計師去處理,結果這個程式設計師搞不定(onTouchEvent返回了false),現在該怎麼辦呢?難題必須要解決,那隻能交給水平更高的上級解決(上級的onTouchEvent被呼叫),如果上級再搞不定,那隻能交給上級的上級去解決,就這樣將難題一層層的向上拋,這是企業內部一種很常見的處理問題的過程。
這裡我畫了一個流程圖,如果理解有錯誤,還請指出一起學習