<br />
下面是事件分發機制的一些結論
-
ViewGroup默認不攔截任何事件。Android源碼中ViewGroup的onInterceptTouchEvent方法默認返回false。
<br /> -
View沒有onInterceptTouchEvent方法,一旦有點擊事件傳遞給它,那么它的onTouchEvent方法就會被調用。
<br /> -
正常情況下,一個事件序列只能被一個View攔截且消耗。因為一旦一個元素攔截了某次事件,那么同一個事件序列內的所有事件都會直接交給它處理,因此同一個事件序列中的事件不能分別由兩個View同時處理,但通過特殊手段可以做到,比如一個View將本該自己處理的事件通過onTouchEvent強行傳遞給其他View處理。
<br /> -
某個View一旦決定攔截,那個這一個事件序列都只能由它來處理,并且它的onInterceptTouchEvent方法不會再被調用。就是說當一個View開始攔截一個事件后,系統會把同一個事件序列內的其他方法都直接交給它來處理,因此就不用再調用它的onInterceptTouchEvent詢問是否要攔截事件了。
<br /> - 某個View一旦開始處理事件,如果它不消耗ACTION_DOWN事件(onTouchEvent返回false),那么同一事件序列中的其他事件都不會再交給它來處理,并且事件將重新交給它的父元素去處理,就是父元素的onTouchEvent被調用。意思就是事件一旦交給一個View處理,那么它就必須消耗掉,否則同一事件序列中剩下的事件就不再交給它來處理了。
<br /> - 如果一個View是不可點擊的,那它的onTouchEvent默認是不消耗事件的,返回值是false。這時它的clickable和longClickable屬性都是false。比如一個TextView。
<br /> - View的enable屬性不影響onTouchEvent的默認返回值。哪怕一個View是disable狀態的,只要它的clickable或者longClickable有一個是true,那么它的onTouchEvent就返回true。
<br /> - onClick會觸發的前提是當前View是可點擊的,并且接收到了down和up事件。
<br />