有3個重要方法: dispatchTouchEvent(MotionEvent ev) onInterceptTouchEvent(MotionEvent ev)如果當前View攔截了事件,那么同一個事件序列當中,此方法不再調用。 onTouchEvent(MotionEvent ev)
傳遞規則順序:Activity—->Window(PhoneWindow)—->View
- 同一個事件序列:down——不確定的move——-up
2)一般來說一個事件序列只能被一個View攔截且消耗。
3)某個View(指ViewGroup)一旦決定攔截,那么這一個事件序列都只能有它來處理。
4)如果View的子元素不處理當前事件,即onTouchEvent返回為false,那么事件將交給它的父元素處理,即父元素的onTouchEvent會被調用。
5)如果View不消耗除ACTION_DOWN以外的其他事件,那么這個點擊事件會消失,此時父元素的OntouchEvent方法不會被調用,直接交給Activity處理
6)ViewGroup默認不攔截任何事件。即onInterceptTouchEvent方法返回false
7)View沒有onInterceptTouchEvent()
8)View的onTouchEvent默認會消耗事件(返回True),除非它是不可點擊的——-clickable 和 longClickable同時為false.注意:View的longClickable默認都為false,clickable要根據控件屬性判斷。
9)View的enable屬性不影響onTouchEvent的默認返回值。(哪怕是disable)
10)事件重視先傳遞給父元素,然后由父元素分發給子View.通過requestDisallowIntercept()分發可以在子元素中干預父元素的事件分發過程,但是ACTION_DOWN事件除外。