av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:6日期:2022-09-27 15:41:11

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

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

開(kāi)發(fā)經(jīng)理拿到,看了一下,感覺(jué)好簡(jiǎn)單,于是

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

開(kāi)發(fā)組長(zhǎng):分派給了自己組員(程序員)

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

實(shí)習(xí)生:好苦逼,無(wú)法分派,怎么辦啊?只能自己干了

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

情況一:

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

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

情況二:

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

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

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

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

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

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

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

而在我們android Touch事件傳遞機(jī)制跟這個(gè)很類似,思想差不多,有句話說(shuō),設(shè)計(jì)來(lái)源于生活。跟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用來(lái)分派事件。其中調(diào)用了onInterceptTouchEvent()和onTouchEvent(),一般不重寫該方法

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

onTouchEvent用來(lái)處理事件。返回true則表示該View能處理該事件,事件將終止向上傳遞(傳遞給其父View);返回false表示不能處理,則把事件傳遞給其父View的onTouchEvent()方法來(lái)處理

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

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

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

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

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

情況一

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

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

情況二

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

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

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

情況一事件傳遞圖:

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

情況二事件傳遞圖:

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

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

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

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

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

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

答:就如我們故事中,他都知道了,底下人都不會(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ì)再次被向上傳遞到我這里來(lái)由我的onTouchEvent來(lái)處理,那就說(shuō)明下面的View都沒(méi)能成功處理該事件);當(dāng)?shù)诙€(gè)ACTION_UP事件向下傳遞到該View,該View的dispatchTouchEvent方法機(jī)會(huì)判斷,若上次的事件由下面的view成功處理了,那么這次的事件就繼續(xù)交給下面的來(lái)處理,若上次的事件沒(méi)有被下面的處理成功,那么這次的事件就不會(huì)向下傳遞了,該View直接調(diào)用自己的onTouchEvent方法來(lái)處理該事件。

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

補(bǔ)充說(shuō)明:

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

謝謝收看。

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

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 一级黄色日本片 | 日韩午夜在线观看 | 亚洲网站在线播放 | 亚洲精品永久免费 | 夜夜爽99久久国产综合精品女不卡 | 羞羞视频免费观看入口 | 国产精品精品久久久 | 日韩av高清 | 在线婷婷 | 91在线一区 | 中文字幕久久精品 | 国产在线视频在线观看 | 91电影| 国产成人精品一区二区 | 欧美成人激情 | 久久精品91 | 亚洲国产成人在线观看 | 欧美日韩亚洲系列 | 国产精品一区二区三级 | 瑟瑟免费视频 | 亚洲男人的天堂网站 | 久热国产精品视频 | 日韩精品在线视频免费观看 | 黄瓜av | 日本久久网 | 99精品视频一区二区三区 | 99热精品国产 | 美女黄18岁以下禁止观看 | 免费一区 | 中文字幕1区| 99久久亚洲| 日本不卡一区二区三区在线观看 | 国产精品久久九九 | 中文字幕在线第二页 | 国产精品久久久久久久久久久久冷 | 日韩影音 | 国产精品久久九九 | 免费一区二区 | 91精品国产综合久久久动漫日韩 | 中文字幕一区二区三区四区五区 | 亚洲一区二区三区在线播放 |