欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)-創(chuàng)新互聯(lián)

這篇文章主要介紹“android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)是專業(yè)的房縣網(wǎng)站建設(shè)公司,房縣接單;提供做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行房縣網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

在Android開(kāi)發(fā)中,事件分發(fā)機(jī)制是一塊Android比較重要的知識(shí)體系,了解并熟悉整套的分發(fā)機(jī)制有助于更好的分析各種點(diǎn)擊滑動(dòng)失效問(wèn)題,更好去擴(kuò)展控件的事件功能和開(kāi)發(fā)自定義控件,同時(shí)事件分發(fā)機(jī)制也是Android面試必問(wèn)考點(diǎn)之一,如果你能把下面的一些事件分發(fā)圖當(dāng)場(chǎng)畫(huà)出來(lái)肯定加分不少。

Android 事件分發(fā)流

關(guān)于Android  事件分發(fā)機(jī)制網(wǎng)上的博文很多,但是很多都是寫(xiě)個(gè)Demo然后貼一下輸出的Log或者拿源碼分析,然后一堆的注釋和說(shuō)明,如果用心的去看肯定是收獲不少但是確實(shí)很難把整個(gè)流程說(shuō)清和記住。曾經(jīng)也是拼命想記住整個(gè)流程,但是一段時(shí)間又忘了,***覺(jué)得分析這種問(wèn)題和事件流的走向,一張圖來(lái)解釋和說(shuō)明會(huì)清晰很多,下面我根據(jù)畫(huà)的一張事件分發(fā)流程圖,說(shuō)明的事件從用戶點(diǎn)擊之后,在不同函數(shù)不同返回值的情況的最終走向。

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

圖 1.

注:

  • 仔細(xì)看的話,圖分為3層,從上往下依次是Activity、ViewGroup、View

  • 事件從左上角那個(gè)白色箭頭開(kāi)始,由Activity的dispatchTouchEvent做分發(fā)

  • 箭頭的上面字代表方法返回值,(return true、return false、return super.xxxxx(),super  的意思是調(diào)用父類實(shí)現(xiàn)。

  • dispatchTouchEvent和  onTouchEvent的框里有個(gè)【true—->消費(fèi)】的字,表示的意思是如果方法返回true,那么代表事件就此消費(fèi),不會(huì)繼續(xù)往別的地方傳了,事件終止。

  • 目前所有的圖的事件是針對(duì)ACTION_DOWN的,對(duì)于ACTION_MOVE和ACTION_UP我們***做分析。

  • Activity 的dispatchTouchEvent 無(wú)論返回什么,都會(huì)調(diào)用ViewGroup  的dispatchTouchEvent(自行看源碼)

仔細(xì)看整個(gè)圖,我們得出事件流 走向的幾個(gè)結(jié)論(希望讀者專心的看下圖 1,多看幾遍,腦子有比較清晰的概念。)

1、如果事件不被中斷,整個(gè)事件流向是一個(gè)類U型圖,我們來(lái)看下這張圖,可能更能理解U型圖的意思。

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

圖 2.

所以如果我們沒(méi)有對(duì)控件里面的方法進(jìn)行重寫(xiě)或更改返回值,而直接用super調(diào)用父類的默認(rèn)實(shí)現(xiàn),那么整個(gè)事件流向應(yīng)該是從Activity—->ViewGroup—>View  從上往下調(diào)用dispatchTouchEvent方法,一直到葉子節(jié)點(diǎn)(View)的時(shí)候,再由View—>ViewGroup—>Activity從下往上調(diào)用onTouchEvent方法。

2、dispatchTouchEvent 和 onTouchEvent 一旦return  true,事件就停止傳遞了(到達(dá)終點(diǎn))(沒(méi)有誰(shuí)能再收到這個(gè)事件)。看下圖中只要return true事件就沒(méi)再繼續(xù)傳下去了,對(duì)于return  true我們經(jīng)常說(shuō)事件被消費(fèi)了,消費(fèi)了的意思就是事件走到這里就是終點(diǎn),不會(huì)往下傳,沒(méi)有誰(shuí)能再收到這個(gè)事件了。

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

圖 3.

3、dispatchTouchEvent 和 onTouchEvent return  false的時(shí)候事件都回傳給父控件的onTouchEvent處理。

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

圖 4.

看上圖深藍(lán)色的線,對(duì)于返回false的情況,事件都是傳給父控件onTouchEvent處理。

  • 對(duì)于dispatchTouchEvent 返回 false  的含義應(yīng)該是:事件停止往子View傳遞和分發(fā)同時(shí)開(kāi)始往父控件回溯(父控件的onTouchEvent開(kāi)始從下往上回傳直到某個(gè)onTouchEvent return  true),事件分發(fā)機(jī)制就像遞歸,return false 的意義就是遞歸停止然后開(kāi)始回溯。

  • 對(duì)于onTouchEvent return false 就比較簡(jiǎn)單了,它就是不消費(fèi)事件,并讓事件繼續(xù)往父控件的方向從下往上流動(dòng)。

4、dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent

ViewGroup 和View的這些方法的默認(rèn)實(shí)現(xiàn)就是會(huì)讓整個(gè)事件安裝U型完整走完,所以 return super.xxxxxx()  就會(huì)讓事件依照U型的方向的完整走完整個(gè)事件流動(dòng)路徑),中間不做任何改動(dòng),不回溯、不終止,每個(gè)環(huán)節(jié)都走到。

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

Paste_Image.png

所以如果看到方法return super.xxxxx()  那么事件的下一個(gè)流向就是走U型下一個(gè)目標(biāo),稍微記住上面這張圖,你就能很快判斷出下一個(gè)走向是哪個(gè)控件的哪個(gè)函數(shù)。

5、onInterceptTouchEvent 的作用

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

圖 5.

Intercept  的意思就攔截,每個(gè)ViewGroup每次在做分發(fā)的時(shí)候,問(wèn)一問(wèn)攔截器要不要攔截(也就是問(wèn)問(wèn)自己這個(gè)事件要不要自己來(lái)處理)如果要自己處理那就在onInterceptTouchEvent方法中  return  true就會(huì)交給自己的onTouchEvent的處理,如果不攔截就是繼續(xù)往子控件往下傳。默認(rèn)是不會(huì)去攔截的,因?yàn)樽覸iew也需要這個(gè)事件,所以onInterceptTouchEvent攔截器return  super.onInterceptTouchEvent()和return  false是一樣的,是不會(huì)攔截的,事件會(huì)繼續(xù)往子View的dispatchTouchEvent傳遞。

6、ViewGroup 和View  的dispatchTouchEvent方法返回super.dispatchTouchEvent()的時(shí)候事件流走向。

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

圖 6

首先看下ViewGroup 的dispatchTouchEvent,之前說(shuō)的return true是終結(jié)傳遞。return false  是回溯到父View的onTouchEvent,然后ViewGroup怎樣通過(guò)dispatchTouchEvent方法能把事件分發(fā)到自己的onTouchEvent處理呢,return  true和false 都不行,那么只能通過(guò)Interceptor把事件攔截下來(lái)給自己的onTouchEvent,所以ViewGroup  dispatchTouchEvent方法的super默認(rèn)實(shí)現(xiàn)就是去調(diào)用onInterceptTouchEvent,記住這一點(diǎn)。

那么對(duì)于View的dispatchTouchEvent return  super.dispatchTouchEvent()的時(shí)候呢事件會(huì)傳到哪里呢,很遺憾View沒(méi)有攔截器。但是同樣的道理return true是終結(jié)。return  false 是回溯會(huì)父類的onTouchEvent,怎樣把事件分發(fā)給自己的onTouchEvent 處理呢,那只能return  super.dispatchTouchEvent,View類的dispatchTouchEvent()方法默認(rèn)實(shí)現(xiàn)就是能幫你調(diào)用View自己的onTouchEvent方法的。

說(shuō)了這么多,不知道有說(shuō)清楚沒(méi)有,我這邊***總結(jié)一下:

  • 對(duì)于 dispatchTouchEvent,onTouchEvent,return true是終結(jié)事件傳遞。return false  是回溯到父View的onTouchEvent方法。

  • ViewGroup 想把自己分發(fā)給自己的onTouchEvent,需要攔截器onInterceptTouchEvent方法return true  把事件攔截下來(lái)。

  • ViewGroup 的攔截器onInterceptTouchEvent 默認(rèn)是不攔截的,所以return  super.onInterceptTouchEvent()=return false;

  • View  沒(méi)有攔截器,為了讓View可以把事件分發(fā)給自己的onTouchEvent,View的dispatchTouchEvent默認(rèn)實(shí)現(xiàn)(super)就是把事件分發(fā)給自己的onTouchEvent。

ViewGroup和View 的dispatchTouchEvent 是做事件分發(fā),那么這個(gè)事件可能分發(fā)出去的四個(gè)目標(biāo)

注:——> 后面代表事件目標(biāo)需要怎么做。

1、 自己消費(fèi),終結(jié)傳遞。——->return true ;

2、 給自己的onTouchEvent處理——-> 調(diào)用super.dispatchTouchEvent()系統(tǒng)默認(rèn)會(huì)去調(diào)用  onInterceptTouchEvent,在onInterceptTouchEvent return  true就會(huì)去把事件分給自己的onTouchEvent處理。

3、 傳給子View——>調(diào)用super.dispatchTouchEvent()默認(rèn)實(shí)現(xiàn)會(huì)去調(diào)用 onInterceptTouchEvent  在onInterceptTouchEvent return false,就會(huì)把事件傳給子類。

4、  不傳給子View,事件終止往下傳遞,事件開(kāi)始回溯,從父View的onTouchEvent開(kāi)始事件從下到上回歸執(zhí)行每個(gè)控件的onTouchEvent——->return  false;

注: 由于View沒(méi)有子View所以不需要onInterceptTouchEvent  來(lái)控件是否把事件傳遞給子View還是攔截,所以View的事件分發(fā)調(diào)用super.dispatchTouchEvent()的時(shí)候默認(rèn)把事件傳給自己的onTouchEvent處理(相當(dāng)于攔截),對(duì)比ViewGroup的dispatchTouchEvent  事件分發(fā),View的事件分發(fā)沒(méi)有上面提到的4個(gè)目標(biāo)的第3點(diǎn)。

ViewGroup和View的onTouchEvent方法是做事件處理的,那么這個(gè)事件只能有兩個(gè)處理方式:

1、自己消費(fèi)掉,事件終結(jié),不再傳給誰(shuí)—–>return true;

2、繼續(xù)從下往上傳,不消費(fèi)事件,讓父View也能收到到這個(gè)事件—–>return  false;View的默認(rèn)實(shí)現(xiàn)是不消費(fèi)的。所以super==false。

ViewGroup的onInterceptTouchEvent方法對(duì)于事件有兩種情況:

1、攔截下來(lái),給自己的onTouchEvent處理—>return true;

2、不攔截,把事件往下傳給子View—->return false,ViewGroup默認(rèn)是不攔截的,所以super==false;

關(guān)于ACTION_MOVE 和 ACTION_UP

上面講解的都是針對(duì)ACTION_DOWN的事件傳遞,ACTION_MOVE和ACTION_UP在傳遞的過(guò)程中并不是和ACTION_DOWN  一樣,你在執(zhí)行ACTION_DOWN的時(shí)候返回了false,后面一系列其它的action就不會(huì)再得到執(zhí)行了。簡(jiǎn)單的說(shuō),就是當(dāng)dispatchTouchEvent在進(jìn)行事件分發(fā)的時(shí)候,只有前一個(gè)事件(如ACTION_DOWN)返回true,才會(huì)收到ACTION_MOVE和ACTION_UP的事件。具體這句話很多博客都說(shuō)了,但是具體含義是什么呢?我們來(lái)看一下下面的具體分析。

上面提到過(guò)了,事件如果不被打斷的話是會(huì)不斷往下傳到葉子層(View),然后又不斷回傳到Activity,dispatchTouchEvent 和  onTouchEvent 可以通過(guò)return true 消費(fèi)事件,終結(jié)事件傳遞,而onInterceptTouchEvent  并不能消費(fèi)事件,它相當(dāng)于是一個(gè)分叉口起到分流導(dǎo)流的作用,ACTION_MOVE和ACTION_UP  會(huì)在哪些函數(shù)被調(diào)用,之前說(shuō)了并不是哪個(gè)函數(shù)收到了ACTION_DOWN,就會(huì)收到 ACTION_MOVE 等后續(xù)的事件的。

下面通過(guò)幾張圖看看不同場(chǎng)景下,ACTION_MOVE事件和ACTION_UP事件的具體走向并總結(jié)一下規(guī)律。

1、我們?cè)赩iewGroup1 的dispatchTouchEvent 方法返回true消費(fèi)這次事件

ACTION_DOWN 事件從(Activity的dispatchTouchEvent)——–> (ViewGroup1  的dispatchTouchEvent) 后結(jié)束傳遞,事件被消費(fèi)(如下圖紅色的箭頭代碼ACTION_DOWN 事件的流向)。

//打印日志 Activity | dispatchTouchEvent --> ACTION_DOWN  ViewGroup1 | dispatchTouchEvent --> ACTION_DOWN ---->消費(fèi)

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

在這種場(chǎng)景下ACTION_MOVE和ACTION_UP 將如何呢,看下面的打出來(lái)的日志

Activity | dispatchTouchEvent --> ACTION_MOVE  ViewGroup1 | dispatchTouchEvent --> ACTION_MOVE ---- TouchEventActivity | dispatchTouchEvent --> ACTION_UP  ViewGroup1 | dispatchTouchEvent --> ACTION_UP ----

下圖中

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

Paste_Image.png

2、我們?cè)赩iewGroup2 的dispatchTouchEvent 返回true消費(fèi)這次事件

Activity | dispatchTouchEvent --> ACTION_DOWN  ViewGroup1 | dispatchTouchEvent --> ACTION_DOWN ViewGroup1 | onInterceptTouchEvent --> ACTION_DOWN ViewGroup2 | dispatchTouchEvent --> ACTION_DOWN ---->消費(fèi) Activity | dispatchTouchEvent --> ACTION_MOVE  ViewGroup1 | dispatchTouchEvent --> ACTION_MOVE ViewGroup1 | onInterceptTouchEvent --> ACTION_MOVE ViewGroup2 | dispatchTouchEvent --> ACTION_MOVE ---- TouchEventActivity | dispatchTouchEvent --> ACTION_UP  ViewGroup1 | dispatchTouchEvent --> ACTION_UP ViewGroup1 | onInterceptTouchEvent --> ACTION_UP ViewGroup2 | dispatchTouchEvent --> ACTION_UP ----

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

Paste_Image.png

3、我們?cè)赩iew 的dispatchTouchEvent 返回true消費(fèi)這次事件

這個(gè)我不就畫(huà)圖了,效果和在ViewGroup2 的dispatchTouchEvent return true的差不多,同樣的收到ACTION_DOWN  的dispatchTouchEvent函數(shù)都能收到 ACTION_MOVE和ACTION_UP。

所以我們就基本可以得出結(jié)論如果在某個(gè)控件的dispatchTouchEvent 放回true消費(fèi)終結(jié)事件,那么收到ACTION_DOWN 的函數(shù)也能收到  ACTION_MOVE和ACTION_UP。

4、我們?cè)赩iew 的onTouchEvent 返回true消費(fèi)這次事件

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

5、我們?cè)赩iewGroup 2 的onTouchEvent 返回true消費(fèi)這次事件

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

6、我們?cè)赩iewGroup 1 的onTouchEvent 返回true消費(fèi)這次事件

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

Paste_Image.png

7、我們?cè)贏ctivity 的onTouchEvent 返回true消費(fèi)這次事件

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

8、我們?cè)赩iew的dispatchTouchEvent 返回false并且Activity 的onTouchEvent

返回true消費(fèi)這次事件

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

9、我們?cè)赩iew的dispatchTouchEvent 返回false并且ViewGroup 1 的onTouchEvent  返回true消費(fèi)這次事件

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

10、我們?cè)赩iew的dispatchTouchEvent 返回false并且在ViewGroup 2 的onTouchEvent  返回true消費(fèi)這次事件

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

11、我們?cè)赩iewGroup2的dispatchTouchEvent 返回false并且在ViewGroup1  的onTouchEvent返回true消費(fèi)這次事件

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn) 

12、我們?cè)赩iewGroup2的onInterceptTouchEvent 返回true攔截此次事件并且在ViewGroup 1  的onTouchEvent返回true消費(fèi)這次事件。

紅色的箭頭代表ACTION_DOWN 事件的流向

藍(lán)色的箭頭代表ACTION_MOVE 和 ACTION_UP 事件的流向

android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)

一下子畫(huà)了好多圖,還有好幾種情況就不再畫(huà)了,相信你也看出規(guī)律了,對(duì)于在onTouchEvent消費(fèi)事件的情況:在哪個(gè)View的onTouchEvent  返回true,那么ACTION_MOVE和ACTION_UP的事件從上往下傳到這個(gè)View后就不再往下傳遞了,而直接傳給自己的onTouchEvent  并結(jié)束本次事件傳遞過(guò)程。

對(duì)于ACTION_MOVE、ACTION_UP總結(jié):ACTION_DOWN事件在哪個(gè)控件消費(fèi)了(return true),  那么ACTION_MOVE和ACTION_UP就會(huì)從上往下(通過(guò)dispatchTouchEvent)做事件分發(fā)往下傳,就只會(huì)傳到這個(gè)控件,不會(huì)繼續(xù)往下傳,如果ACTION_DOWN事件是在dispatchTouchEvent消費(fèi),那么事件到此為止停止傳遞,如果ACTION_DOWN事件是在onTouchEvent消費(fèi)的,那么會(huì)把ACTION_MOVE或ACTION_UP事件傳給該控件的onTouchEvent處理并結(jié)束傳遞。

到此,關(guān)于“android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

文章題目:android中事件分發(fā)機(jī)制怎么實(shí)現(xiàn)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)源:http://chinadenli.net/article4/hhdie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版靜態(tài)網(wǎng)站電子商務(wù)App設(shè)計(jì)營(yíng)銷型網(wǎng)站建設(shè)ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)