Android 觸控流程,詳細了解dispatchTouchEvent丛版、onInterceptTouchEvent巩掺、onTouchEvent

Android點擊事件分發(fā)機制

??? 想要玩轉(zhuǎn)Android自定義控件,除了繪制UI之外页畦,控件的交互也是必不可少的胖替,其中最常見的就是與屏幕的指尖的交互,對于簡單的控件而言豫缨,實現(xiàn)onclick事件就可以了独令,但是對于復(fù)雜交互,還遠遠不夠好芭。今天特意整理Android的事件分發(fā)機制燃箭,以便自己加深理解。


??? 1.dispatchTouchEvent ????????? ————事件分發(fā)方法舍败,分發(fā)Event所調(diào)用

??? 2.onInterceptTouchEvent ? ? ?————事件攔截方法招狸,攔截Event所調(diào)用

??? 3.onTouchEvent ? ? ? ? ? ? ? ? ? ?————事件響應(yīng)方法,處理Event所調(diào)用

兩大類別的view所包含的的方法

?? ? 1.view???????????????? ———dispatchTouchEvent() ??????? onTouchEvent()

????? 2.viewgroup????? ———dispatchTouchEvent()??onInterceptTouchEvent()??? onTouchEvent()


????? 3.activity?????????? ———dispatchTouchEvent() ??????? onTouchEvent()
??????? 為什么activity也會有該觸發(fā)事件邻薯,來看一下源碼

在activity的父類中裙戏,實現(xiàn)了該方法

???? activity作為用戶與系統(tǒng)連接的橋梁,肯定是要實現(xiàn)觸摸事件的啊厕诡。和view的實現(xiàn)方法一樣累榜,也是實現(xiàn)了dispatchTouchEvent() ??????? onTouchEvent()這兩個方法。

1.測試布局


測試布局

activity代碼:

@Override

public boolean onTouchEvent(MotionEvent event){

????? Log.i(TAG,"Activity's onTouchEvent returns super");

????? return super.onTouchEvent(event);

}

@Override

public boolean dispatchTouchEvent(MotionEvent ev){

???? Log.i(TAG,"Activity's dispatchTouchEvent returns super");

??? return super.dispatchTouchEvent(ev);

}

viewGroup1代碼:

@Override

public boolean onTouchEvent(MotionEvent event){

?? Log.i(TAG,"ViewGroup1's onTouchEvent returns super");

?? return super.onTouchEvent(event);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent ev){

??? Log.i(TAG,"ViewGroup1's onInterceptTouchEvent returns super");

??? return? super.onInterceptTouchEvent(ev);

}

@Override

public boolean dispatchTouchEvent(MotionEvent ev){

??? Log.i(TAG,"ViewGroup1's dispatchTouchEvent returns super");

?? return super.dispatchTouchEvent(ev);

}

viewGroup2代碼與viewyiGroup一樣灵嫌,無非就是log輸出時將ViewGroup1改為ViewGroup2


View代碼

@Override

public boolean onTouchEvent(MotionEvent event){

?? Log.i(TAG,"View's onTouchEvent returns super");

?? return super.onTouchEvent(event);

}

@Override

public boolean dispatchTouchEvent(MotionEvent ev){

?? Log.i(TAG,"View's dispatchTouchEvent returns super");

?? return super.dispatchTouchEvent(ev);

}

這些方法的區(qū)別是什么呢信柿?以及他們的流程是怎樣的的呢冀偶?

??? 我們來打印log看一下輸出的過程:分別在activity中、view中渔嚷,viewgroup中。

1.讓所有的onInterceptTouchEvent稠曼、dispatchTouchEvent及onTouchEvent默認均返回super(父類的實現(xiàn)方法)形病,輕輕點擊MyView然后快速抬起,查看相應(yīng)的Log:


log

可以仔細看出他的執(zhí)行順序:


默認返回super執(zhí)行順序

然后我們探索dispatchTouchEvent()方法霞幅,令其return false(這里以ViewGroup2的dispatchTouchEvent()方法為例)漠吻,log如下


log

該流程圖為:

viewGroup2.dispatchTouchEvent()返回vfalse

結(jié)論:當dispatchTouchEvent()返回false時,會將事件傳遞給上一級View的onTouchEvent()方法處理司恳。由于Activity已經(jīng)沒有比它更高一級的View途乃,所以如果時Activity的dispatchTouchEvent方法return false的話,事件會直接被消費掉(即終止傳遞)扔傅。

接著讓dispatchTouchEvent()方法return true(這里以ViewGroup2的dispatchTouchEvent()方法為例)耍共,log如下:


viewGroup2.dispatchTouchEvent()返回true

可以看到傳遞流程,可以用流程圖表示為:


這里寫圖片描述

規(guī)律:如果dispatchTouchEvent()方法返回true時猎塞,事件會被消費掉试读,不再傳遞。

然后我們探索一下onTouchEvent()方法荠耽,令其return false,(這里以最里層的View的onTouchEvent()方法為例)钩骇,log如下:

log

可以看到傳遞流程,可以用流程圖表示為:


view.onTouchEvent()返回false

規(guī)律:如果onTouchEvent()方法返回false時铝量,跟默認return super是一樣的倘屹,都會一直向上傳遞到上一級view的onTouchEvent()方法。

事實上慢叨,onTouchEvent()方法super父類的默認實現(xiàn)返回的就是false纽匙。

super默認返回false

然后我們讓onTouchEvent()方法return true,(這里以最里層的View的onTouchEvent()方法為例),log如下:


log

可以看到傳遞流程插爹,可以用流程圖表示為:


view.onTouchEvent()返回true

規(guī)律:如果onTouchEvent()方法返回true時哄辣,事件會被消費掉,不再傳遞赠尾。跟dispatchTouchEvent()return true的時候類似力穗。

最后,我們來探索onInterceptTouchEvent()方法,令其return false,(這里以最里層的ViewGroup2的onInterceptTouchEvent()方法為例)气嫁,log如下:


log

規(guī)律:這里就不貼流程圖了当窗,但是可以看到onInterceptTouchEvent()方法return false和return super是一樣的。都是默認將觸摸事件傳給下一級view的dispatchTouchEvent()方法寸宵。

最后崖面,我們讓onInterceptTouchEvent()方法return true,(這里以最里層的ViewGroup2的onInterceptTouchEvent()方法為例)元咙,log如下:


log

可以看到傳遞流程,可以用流程圖表示為:


viewGroup.onIntercepTouchEvent()返回true

規(guī)律:如果onInterceptTouchEvent()方法返回true時巫员,Touch事件會被直接傳遞給ViewGroup自己的onTouchEvent()方法處理庶香。

總結(jié)歸納

1.對于dispatchTouchEvent()方法:

?? return true:消費掉事件,終止傳遞简识。

?? return false: 將事件傳遞給上一級View的onTouchEvent()方法赶掖。如果是Activity的dispatchTouchEvent()方???? 法,則也是消費掉事件七扰,終止傳遞奢赂。

?? return super:如果是Activity,則傳給下一級view(viewGroup)的dispatchTouchEvent;如果是ViewGroup颈走,則傳給自己的onInterceptTouchEvent();如果是View,則傳給自己的onTouchEvent().

2..對于onTouchEvent()方法:

?? return true:消費掉事件膳灶,終止傳遞。

? return false/super:將事件傳遞給上一級view的onTouchEvent()方法立由。

3.對于onInterceptTouchEvent()方法:

?? return true:將事件傳遞給ViewGroup自己的onTouchEvent()方法處理轧钓。

?? return false/super:將事件傳遞給下一級View的dispatchTouchEvent()。

回到之前我們的一個問題拆吆,為什么只有ViewGroup有onInterceptTouchEvent()方法呢聋迎,從上面的整個觸摸事件分發(fā)傳遞機制我們可以發(fā)現(xiàn),ViewGroup本身的dispatchTouchEvent()方法無論返回什么都不能將事件傳遞給自己的onTouchEvent()方法處理枣耀,那就只好設(shè)計了一個這樣子的方法霉晕,作為攔截器,攔截事件交給自己處理了捞奕。只要onInterceptTouchEvent()returntrue就可以實現(xiàn)觸摸事件攔截牺堰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市颅围,隨后出現(xiàn)的幾起案子伟葫,更是在濱河造成了極大的恐慌,老刑警劉巖院促,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筏养,死亡現(xiàn)場離奇詭異,居然都是意外死亡常拓,警方通過查閱死者的電腦和手機渐溶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄抬,“玉大人茎辐,你說我怎么就攤上這事。” “怎么了拖陆?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵弛槐,是天一觀的道長。 經(jīng)常有香客問我依啰,道長乎串,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任速警,我火速辦了婚禮灌闺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坏瞄。我一直安慰自己,他們只是感情好甩卓,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布鸠匀。 她就那樣靜靜地躺著,像睡著了一般逾柿。 火紅的嫁衣襯著肌膚如雪缀棍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天机错,我揣著相機與錄音爬范,去河邊找鬼。 笑死弱匪,一個胖子當著我的面吹牛青瀑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萧诫,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼斥难,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帘饶?” 一聲冷哼從身側(cè)響起哑诊,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎及刻,沒想到半個月后镀裤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡缴饭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年暑劝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茴扁。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡铃岔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毁习,我是刑警寧澤智嚷,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站纺且,受9級特大地震影響盏道,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜载碌,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一猜嘱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫁艇,春花似錦朗伶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猾漫,卻和暖如春点晴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悯周。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工粒督, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禽翼。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓屠橄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捐康。 傳聞我的和親對象是個殘疾皇子仇矾,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容