Android 簡述事件分發機制
阿新 • • 發佈:2019-02-05
1.ViewGroup有三個方法:
Touch 事件相關方法 | 方法功能 | 標記 |
---|---|---|
dispatchTouchEvent(MotionEvent ev) | 事件分發 | 1 |
onInterceptTouchEvent(MotionEvent ev) | 事件攔截 | 2 |
onTouchEvent(MotionEvent ev) | 處理事件 | 3 |
這樣,ViewGroup和View對應的方法:
ViewGroup/View | 方法 |
---|---|
ViewGroup | 1、2、3 |
View | 1、3 |
第一次進入ViewGroup:
走1:
Return true:停止傳遞,直接走自己的3方法
False:傳給下一個ViewGroup的1方法
Return super.dispatchTouchEvent(ev):走自己的2方法—–>走2:
True:停止傳遞,走自己的3方法
False:傳給下一個View的1方法
Return super.onInterceptTouchEvent(ev):走自己的3方法(與true相同)—–>(預設的是父類攔截)走3:
True:自己處理掉事件
False:事件向上傳遞,由上一級的3處理
Return super.onTouchEvent(ev):事件向上傳遞,由上一級的3處理(與false相同)—->事件回傳的時候走的是各自View的3方法:
true:在當前View消費掉事件
False:返到上一級,由上一級的onTouchEvent處理—->
上一級返回為true就處理;返回false就接著往上一級傳遞!如果最外層的View沒有處理,事件消失。
如果按住控制元件不放,再移到其它地方,事件就會取消。
對應圖示:
2.焦點衝突
比如:ListView條目點選事件,裡面的子view還有點選事件:在item的根節點裡面設定:
android:descendantFocusability=“blocksDescendants”
3.請求父容器不要攔截我的事件:
getParent().requestDisallowInterceptTouchEvent(false);