Android中事件觸發是由外向內的,返回則是從里向外,今天大概介紹一下事件的分發機制
首先來說一下過程,Android事件分發是由activity-> DecorView->view group->view的過程,主要涉及的方法有
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
事件分發,這個方法主要是起到分發的作用
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
此方法是對事件傳遞進行攔截,主要是在ViewGroup中才會有,返回true代表不允許事件繼續向子View傳遞,將會觸發當前View的onTouchEvent(),進行事件的消費;返回false代表不對事件進行攔截,事件可以傳遞給子view,默認返回false
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
此方法是觸摸事件,參數為手勢集合,這里就是監聽用戶的手勢動作,然后回調touchlistener的onTouch方法。如果我們僅僅只是用手指點擊按鈕,然后馬上松開,onTouch事件中只會執行ACTION_DOWN和ACTION_UP動作;如果用手機點擊按鈕,并且手指還在按鈕上滑動了一會兒,那么滑動的過程中,ACTION_MOVE動作就會不停的執行
那么onClick事件又是如何觸發的呢,怎么樣才能只執行onTouch而不執行onClick呢?
從源碼上看,是先執行onTouch,根據用戶的手勢和返回值來決定是不是要執行onClick事件,也就是說onTouch執行在onClick之前,并且能夠影響onClick的執行。
如果只想執行onTouch事件并且不往下分發執行的話,只需要將onTouch方法的返回值改為true,就會只執行onTouch事件,不執行onClick事件
總結 事件傳遞機制調用順序:
ViewGroup的事件傳遞方法:
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
View的事件傳遞方法:
dispatchTouchEvent
onTouchEvent
只有ViewGroup容器才有onInterceptTouchEvent方法。因為作為最后的子view沒必要再攔截了,已經無法繼續向下傳遞事件了,是否攔截已經沒有意義了。