最近已經在開始準備面試了。複習了很多。把溫故而知新的知識點,用最簡白的白話文表達出來。一呢、是記錄下。二呢、萬一能幫助大家的話,更好
一、事件分發的3個重要方法
首先我隨便建了一個ViewGroup,3個重要方法是
- dispatchTouchEvent
- onInterceptTouchEvent
- onTouchEvent
public class MyViewGroup extends ViewGroup {
//...省略部分代碼
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}
然後對這個3個方法做下簡單的描述
方法 | 作用 | 調用時刻 |
---|---|---|
dispathTouchEvent() | 分發(傳遞)點擊事件 | 當點擊事件能夠傳遞給當前View時,該方法就會被調用 |
onInterceptTouchEvent() | 判斷是否攔截了某事件(只存在於ViewGroup,普通View沒有這個方法) | 在dispathTouchEvent()內部調用 |
onTouchEvent() | 處理點擊事件 | 在dispathTouchEvent()內部調用 |
事件分發順序是 Activity(Window) --> ViewGroup --> View
二、放大招,分析事件分發流程。
圖中:
- super:調用父類方法
- true:消費事件,即事件不繼續往下傳遞
- false:不消費事件,事件也不繼續往下傳遞 / 交由父控件onTouchEvent()處理
看着上面的圖和分析如下。總共分3個步驟:
步驟1(在Activity裏):
事件首先在Activity裏的dispatchTouchEvent()
返回值:
true / false -------> 消費事件(這裏false也是消費事件)
super -------------> 事件下發到ViewGroup,調用ViewGroup的dispatchTouchEvent()
步驟2(在ViewGroup裏)
事件在ViewGroup裏的dispatchTouchEvent()
返回值:
true --------------> 消費事件
false -------------> 不消費事件,也不下發,交給父控件的onTouchEvent()處理
super -------------> 事件下發到當前ViewGroup的onInterceptTouchEvent()
事件在ViewGroup裏的onInterceptTouchEvent()
返回值:
true --------------> 事件下發到當前ViewGroup的onTouchEvent()
false / super -----> 事件下發到子View,調用子View的dispatchTouchEvent()
事件在ViewGroup裏的onTouchEvent()
返回值:
true --------------> 消費事件
false / super -----> 不消費事件,也不下發,交給父控件的onTouchEvent()處理
步驟3(在子View裏)
事件在View裏的dispatchTouchEvent()
返回值:
true --------------> 消費事件
false -------------> 不消費事件,也不下發,交給父控件的onTouchEvent()處理
super -------------> 事件下發到當前View的onTouchEvent()
事件在View裏的onTouchEvent()
返回值:
true --------------> 消費事件
false / super -----> 不消費事件,也不下發,交給父控件的onTouchEvent()處理