在騰訊的面試中被問到父View、子View的點擊事件流程,這幾天好好學習了一遍。主要參考張鴻洋和郭霖的博客。
在觸發OnTouch事件的時候Android的GroupView會調用如下三個函數:
public boolean dispatchTouchEvent(MotionEvent ev) //用於事件的分發
public boolean onInterceptTouchEvent(MotionEvent ev) // 用於事件的攔截
public boolean onTouchEvent(MotionEvent ev) //處理事件
具體流程如下:
- touch事件都是先傳遞到ViewGroup,再傳遞到View的;
- ViewGroup的onInterceptTouchEvent方法用來攔截事件傳遞,默認返回false,不攔截;
- View的dispatchTouchEvent方法中會先調用OnTouchListener的onTouch方法,如果返回爲true,表示touch事件被消費;如果返回false,則會繼續執行View的onTouchEvent方法;
- 只要子View支持點擊或者長按事件,它的dispatchTouchEvent一定返回true,touch事件會被消費,ViewGroup的OnTouchListener將會監聽不到touch事件,onTouchEvent也就不會觸發。