關於控件touch事件的整理

關於touch事件的傳遞:在Activity中接觸屏幕後會產生MotionEvent,傳遞順序:

首先觸發Activity的dispatchTouchEvent

然後觸發Activity的onUserInteraction

然後觸發Layou的dispatchTouchEvent

然後觸發Layout的onInterceptTouchEvent(onTouchevent)

然後觸發View的dispatchTouchEvent

然後觸發View的onTouchEvent

其中需要注意的是Layout的onInterceptTouchEvent和onTouchEvent以及View的dispatchTouchEvent和onTouchEvent的使用方法


對於onInterceptTouchEvent而言,其源代碼僅一個“return false”,如果需要攔截該層MontionEvent應覆蓋並返回true,此時將觸發該Layout的onTouchEvent,並且不再向下傳遞,記住無論是View還是ViewGroup一旦觸發onTouchEvent,則本次MontionEvent都不可能向下傳遞,

對於onTouchEvent,這個函數是觸發其他Listener的關鍵(如click等,但不含onTouchListener),一般來說不應全部覆蓋,應該在適時調用Super.onTouchEvent,其返回值意義是若返回true,則後續MontionEvent(down與up間的action)都傳遞到此onTouchEvent,若返回false則以後的MontionEvent傳遞到上層onTouchEvent(如Layout的onTouchEvent),

對於View的dispatchTouchEvent,其源代碼說明了先調用onTouchListener,若其返回爲true,則不再調用onTouchEvent,並dispatchTouchEvent直接返回true,若其返回爲false,則調用onTouchEvent,並以onTouchEvent的返回值爲最終返回值,

注:View(viewGroup)的dispatch函數由系統上層直接調用,而其他的onTouchEvent,onTouchListener等是由dispatch來調用,其返回值也是先返回給dispatch,再由dispatch返回,故核心應在dispatch函數,故最好不要直接重寫該函數,

綜上,個人認爲對於dispatchTouchEvent與onTouchEvent不應直接覆蓋,應適時調用super的代碼;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章