一、事件和手勢
(1) MotionEvent:
所有 Touch 事件都被封裝成了 MotionEvent 對象摸袁,包括 Touch 的位置渠退、時間、歷史記錄以及第幾個手指(多指觸摸)等贤牛。
(2) Touch事件類型:
ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL
(3) 手勢:
Touch事件組成手勢,所有手勢都是以 ACTION_DOWN 開始 ACTION_UP 或ACTION_CANCEL結(jié)束则酝。
(4) 對事件的處理包括三類殉簸,分別為:
傳遞——dispatchTouchEvent()函數(shù)
攔截——onInterceptTouchEvent()函數(shù)(僅ViewGroup)
消費——onTouchEvent()函數(shù)和 OnTouchListener。
一次事件只能被一個view或者viewGroup消費
二沽讹、事件的傳遞流程:
(1) 事件從 Activity的dispatchTouchEvent()開始傳遞般卑,只要沒有被停止或攔截,從最上層的 View(ViewGroup)開始一直往下(子 View)傳遞爽雄。子 View 可以通過 onTouchEvent()對事件進行處理蝠检。
(2) 事件由父 View(即ViewGroup)傳遞給子 View,ViewGroup 可以通過 onInterceptTouchEvent()對事件做攔截挚瘟,停止其往下傳遞叹谁。
(3) 如果事件從上往下傳遞過程中一直沒有被停止,且最底層子 View 沒有消費事件乘盖,事件會反向往上傳遞焰檩,這時父 View(ViewGroup)可以進行消費,如果還是沒有被消費的話订框,最后會到 Activity 的 onTouchEvent()函數(shù)析苫。
(4) 如果 View 沒有對 ACTION_DOWN 進行消費,表明它對此不感興趣,則之后的其他事件不會傳遞過來(也是一種效率提升)衩侥。
(5) OnTouchListener 優(yōu)先于 onTouchEvent()對事件進行消費浪腐。
上面的消費即表示相應(yīng)函數(shù)返回值為 true。
三顿乒、關(guān)鍵方法:
1议街、View事件相關(guān)方法:
(1) dispatchTouchEvent()事件分發(fā)
(2) onTouchEvent() 事件處理
dispatchTouchEvent()方法:如果view對事件感興趣,則會消費事件璧榄,在消費事件時特漩,View.OnTouchListener.onTouch()優(yōu)先級高于View.onTouchEvent():
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
如果有OnTouchListener,優(yōu)先把事件發(fā)送給View.OnTouchListener.onTouch()處理骨杂;如果沒有消費掉涂身,則使用View.onTouchEvent()來處理;
如果到最后View.onTouchEvent()也沒有消費掉搓蚪,則事件會從下往上傳蛤售,調(diào)用ViewGroup.onTouchEvent()和Activity.onTouchEvent();
2、ViewGroup事件相關(guān)方法:
(1) dispatchTouchEvent()事件分發(fā)妒潭;
(2) onInterceptTouchEvent()攔截事件;
(3) onTouchEvent()事件處理; 比view多了一個攔截事件的方法;
如果onInterceptTouchEvent()返回true悴能,則攔截該事件,自己處理雳灾,不會傳遞給子view漠酿;
3、Activity事件相關(guān)方法:
(1) dispatchTouchEvent(MotionEvent ev)谎亩;
(2) onTouchEvent(MotionEvent ev);
四炒嘲、事件處理流程:
參考:
[Mastering the Android Touch System]
http://files.cnblogs.com/files/sunzn/PRE_andevcon_mastering-the-android-touch-system.pdf
https://www.youtube.com/watch?v=EZAoJU-nUyI