中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Android Touch事件傳遞機(jī)制通俗講解

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用

在講正題之前我們講一段有關(guān)任務(wù)傳遞的小故事,拋磚迎玉下:

話說一家軟件公司,來一個(gè)任務(wù),分派給了開發(fā)經(jīng)理去完成:

開發(fā)經(jīng)理拿到,看了一下,感覺好簡單,于是

開發(fā)經(jīng)理:分派給了開發(fā)組長

開發(fā)組長:分派給了自己組員(程序員)

程序員:分派給了自己帶的實(shí)習(xí)生。

實(shí)習(xí)生:好苦逼,無法分派,怎么辦。恐荒茏约焊闪

但是實(shí)習(xí)生能不能做好,有兩種情況了。

情況一:

實(shí)習(xí)生:經(jīng)過一段時(shí)間的研究,琢磨,熬夜,奮斗,死敲,皇天不負(fù)有心人啊,完成了。

后來又來一個(gè)類似的任務(wù),也按著這樣傳遞下去了(開發(fā)經(jīng)理->開發(fā)組長->程序員->實(shí)習(xí)生),又有實(shí)習(xí)生完成了。

情況二:

實(shí)習(xí)生:經(jīng)過一段時(shí)間的研究,琢磨,就是毫無頭緒,無法完成,只能求教師傅(程序員)了。

程序員:啊,我怎么沒留意就給實(shí)習(xí)生搞了,這任務(wù)好難啊,自己研究下,也沒有頭緒,沒辦法只能請(qǐng)求組長了。

開發(fā)組長:這任務(wù)不難啊,怎么我底下的人都不會(huì)了,沒辦法,只能自己搞了,經(jīng)過,一段時(shí)間,完成了,感想,以后要是又有跟這個(gè)很類似的任務(wù),我就自己弄了,不給他們弄了。

后來又來一個(gè)類似的任務(wù),傳遞是這樣的

開發(fā)經(jīng)理:分派給開發(fā)組長

開發(fā)組長:啊,又是跟著上一個(gè)很類似的任務(wù),我自己弄吧,沒過多久也完成了!

PS:以上就是一個(gè)任務(wù)傳遞的過程。上級(jí)一開始總會(huì)想把任務(wù)分派給自己的下屬去弄,然后任務(wù)一步一步去傳遞下去,最后由一個(gè)人去完成他,當(dāng)然傳遞下去,最底下人不會(huì),也會(huì)一步一步的回滾,又他上級(jí)去完成,如果又有一個(gè)類似的任務(wù),那個(gè)節(jié)點(diǎn)不會(huì)的人就不會(huì)再傳遞給他,給他也不會(huì)弄。當(dāng)然實(shí)現(xiàn)中,這些任務(wù)的傳遞也可能被分派人去攔截,比如說,開發(fā)組長本打算分派給程序員,突然他不想傳遞了,就半路攔截了下來。

而在我們android Touch事件傳遞機(jī)制跟這個(gè)很類似,思想差不多,有句話說,設(shè)計(jì)來源于生活。跟Touch事件有關(guān)的處理方法主要由三個(gè):

//分派事件
public boolean dispatchTouchEvent(MotionEvent ev)
//攔截事件 
public boolean onInterceptTouchEvent(MotionEvent ev)
//處理事件
public boolean onTouchEvent(MotionEvent event)

用他們的時(shí)候,我們只需要重寫一下,即可操作,這三個(gè)方法主要在三種類被調(diào)用,那三種類呢?

基類 例子類 擁有的方法
繼承Activity(activity類) MainActivity(因項(xiàng)目而異)
dispatchTouchEvent,onTouchEvent
繼承ViewGroup(View容器) RelativeLayout,F(xiàn)rameLayout,LinearLayout,AbsoluteLayout,ListView,ScrollView…
dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent
繼承View(View控件) Button,EditText,TextView,ImageView….
dispatchTouchEvent,onTouchEvent

而這三個(gè)方法的含義是什么呢?

事件 含義
dispatchTouchEvent
用來分派事件。
其中調(diào)用了onInterceptTouchEvent()和onTouchEvent(),一般不重寫該方法
onInterceptTouchEvent
用來攔截事件。
ViewGroup類中的源碼實(shí)現(xiàn)就是{return false;}表示不攔截該事件,
事件將向下傳遞(傳遞給其子View);
若手動(dòng)重寫該方法,使其返回true則表示攔截,事件將終止向下傳遞,
事件由當(dāng)前ViewGroup類來處理,就是調(diào)用該類的onTouchEvent()方法
onTouchEvent
用來處理事件。
返回true則表示該View能處理該事件,事件將終止向上傳遞(傳遞給其父View);
返回false表示不能處理,則把事件傳遞給其父View的onTouchEvent()方法來處理

根據(jù)上面的小故事,我們用代碼去實(shí)現(xiàn)一下:

我新建了四個(gè)類:MainActivity(開發(fā)經(jīng)理),F(xiàn)irstFrameLayout(開發(fā)組長),SecondRelativeLayout(程序員),ThirdTextView(實(shí)習(xí)生)

在界面的層次關(guān)系如下圖:

我就好比我們前面的故事情況一,情況二那么模擬下:

情況一

首先我們按照上面的故事情況一那樣,任務(wù)一級(jí)一級(jí)傳遞下去(將viewgroup的類的onInterceptTouchEvent都返回false),然后事件就會(huì)一直傳遞到,ThirdTextview,最后,我們把它的onTouchEvent返回ture(含義是實(shí)習(xí)生處理成功了)。我們點(diǎn)擊藍(lán)色區(qū)域。我們看下日志。

情況二

首先我們還是一級(jí)級(jí)傳遞下去(將viewgroup的類的onInterceptTouchEvent都返回false),然后是傳遞到ThirdTextview,我們將它的onTouchEvent返回false(含義是實(shí)習(xí)生處理失敗了),再講SecondRelativeLayout的onTouchEvent返回false(含義是程序員處理失敗了),最后講FirstFrameLayout的onTouchEvent返回true(含義是組長處理成功了)。我們點(diǎn)擊藍(lán)色區(qū)域。我們看下日志,如下圖。

注:上面兩種情況的日志圖,紅色框代表第一個(gè)任務(wù),黃色框代表第二個(gè)類似的任務(wù)。根據(jù)上圖日志,我們畫下傳遞圖:

情況一事件傳遞圖:

情況二事件傳遞圖:

從上面兩張事件傳遞圖我們的出來一些結(jié)論:

1.事件是先有dispatchTouchEvent分派給下一級(jí)

2.要經(jīng)過onInterceptTouchEvent是否需要攔截,不攔截傳遞給下一級(jí),最終傳遞給view控件,

3.onTouchEvent方法中,在處理事件中,如果返回True,則表示能處理,傳遞將會(huì)終止。反著,不能,如果不能的話,這會(huì)返回上一級(jí)的onTouchEvent方法中,如果還是false,會(huì)一直到到上一層的onTouchEvent方法中。

好奇的我們會(huì)發(fā)現(xiàn)一個(gè)問題:圖二中的黃色線,沒有像紅色線那樣,先傳遞到最底層,然后再回滾回去,這是為什么呢?

答:就如我們故事中,他都知道了,底下人都不會(huì)去做了,那么他干嘛還分派給他呢,他就會(huì)自己做了,直接給onTouchEvent ,這就是事件傳遞中的“記憶”功能。我們是手指點(diǎn)擊藍(lán)色區(qū)域,Touch事件有兩個(gè),第一個(gè)ACTION_DOWN,第二個(gè)ACTION_UP,第一個(gè)ACTION_DOWN事件向下傳遞到某View,它把事件繼續(xù)傳遞交給它的子View,它會(huì)記錄該事件是否被它下面的View給處理成功了,(怎么能知道呢?如果該事件會(huì)再次被向上傳遞到我這里來由我的onTouchEvent來處理,那就說明下面的View都沒能成功處理該事件);當(dāng)?shù)诙䝼(gè)ACTION_UP事件向下傳遞到該View,該View的dispatchTouchEvent方法機(jī)會(huì)判斷,若上次的事件由下面的view成功處理了,那么這次的事件就繼續(xù)交給下面的來處理,若上次的事件沒有被下面的處理成功,那么這次的事件就不會(huì)向下傳遞了,該View直接調(diào)用自己的onTouchEvent方法來處理該事件。

PS:關(guān)于這“記憶”功能的信息只在一系列事件完成之前有效,也就是從ACTION_DOWN事件開始,直到后續(xù)事件ACTION_MOVE,ACTION_UP結(jié)束后,“記憶”的信息就會(huì)清除。也就是說如果某View處理ACTION_DOWN事件失敗了(onTouchEvent()返回false),那么后續(xù)的ACTION_MOVE,ACTION_UP等事件就不會(huì)再傳遞到該View了,由其父View自己來處理。在下一次發(fā)生ACTION_DOWN事件的時(shí)候,還是會(huì)傳遞到該View的。

補(bǔ)充說明:

-》若在向下傳遞的過程中被攔截了,即onInterceptTouchEvent方法返回true,則事件將停止向下傳遞,直接由當(dāng)前的onTouchEvent方法來處理,若處理成功則OK,若處理不成功,則事件會(huì)向上傳遞。

謝謝收看。

實(shí)例代碼:http://download.csdn.net/detail/chenjie_920/8398413

標(biāo)簽: isp 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:如何像Python高手(Pythonista)一樣編程

下一篇:一個(gè)Java對(duì)象到底占多大內(nèi)存?