前言
1. 探究的內(nèi)容
在上一篇文章《一步步探索學(xué)習Android Touch事件分發(fā)傳遞機制(一)》中,已經(jīng)以ACTION_DOWN事件為例,對Android系統(tǒng)的Touch事件分發(fā)傳遞機制做了探究喷橙,并得出了形象好記憶的結(jié)論。
這篇文章所探究的問題是與上一篇文章緊密相關(guān)的皂贩,如果對Android Touch事件分發(fā)傳遞機制還不太了解的同學(xué)罐寨,建議先去看看上一篇文章《一步步探索學(xué)習Android Touch事件分發(fā)傳遞機制(一)》。
我們知道,一個操作胰锌,比如一個點擊事件骗绕,是由多個不同TYPE的MOTION_EVENT組成的。for example资昧,點擊事件是由一個ACTION_DOWN事件和一個ACTION_UP事件組成的酬土。那么諸如ACTION_UP和ACTION_MOVE事件是不是跟ACTION_DOWN事件一樣遵循相同的分發(fā)規(guī)律呢?
事實上格带,答案是否定的撤缴。 ACTION_UP和ACTION_MOVE事件的分發(fā)傳遞流程與這之前的ACTION_DOWN事件如何傳遞以及在哪里被消費有密不可分的聯(lián)系。具體我們下面一步步探索了解叽唱。
2. 探究的方法
我們還是繼續(xù)以上一篇文章《一步步探索學(xué)習Android Touch事件分發(fā)傳遞機制(一)》中所寫的Demo為例子屈呕,一步步打Log,去探究整個事件的傳遞流程棺亭,再用繪圖描述他的機制虎眨。
當然知其然須知其所以然,對于Android源碼的分析镶摘,將會在下一篇文章《一步步探索學(xué)習Android Touch事件分發(fā)傳遞機制(三)》中分析嗽桩。
Demo中見分曉
1.Demo代碼
Demo的代碼,不管是界面還是java代碼凄敢,都保持與上一次的一致碌冶。
**2.打Log,找規(guī)律涝缝,識機制 **
1. )所有方法(dispatchTouchEvent(); onInterceptTouchEvent(); onTouchEvent() )都return super的情況:**
首先扑庞,我們保持所有方法都return super,當然這個我上一篇文章探究過拒逮,ACTION_DOWN事件會以類U型的傳遞路線在View樹中分發(fā)傳遞罐氨。
那么ACTION_UP和ACTION_MOVE事件呢?這里以ACTION_UP事件為例做探究滩援。(事實上岂昭,Action_move事件與Action_up事件是遵循類似規(guī)律的。)我對著Demo屏幕中的View做一個點擊操作(前面交代過狠怨,點擊事件是由一個ACTION_DOWN事件和一個ACTION_UP事件組成的)约啊。
-
打log:
注:上圖中,紫色框內(nèi)的是點擊事件的ACTION_DOWN的分發(fā)流程佣赖;綠色框中的是點擊事件的ACTION_UP事件的分發(fā)流程恰矩。后面的圖同理。
規(guī)律:可以看到憎蛤,ACTION_UP事件并沒有按照類U型的結(jié)構(gòu)去在View樹傳遞外傅,而是直接在Activity的onTouchEvent方法中消費掉了纪吮。
-
繪圖如下:
2. )ViewGroup2的dispatchTouchEvent() return true的情況:**
然后我們來探究ACTION_DOWN事件在dispatchTouchEvent()中被消費掉的情況下,ACTION_UP事件是怎么傳遞分發(fā)的萎胰。
-
令ViewGroup2的dispatchTouchEvent() return true碾盟,打log:
規(guī)律:當ACTION_DOWN事件在某一個View或者ViewGroup的dispatchTouchEvent()方法中被消費掉的情況下,對應(yīng)的ACTION_UP事件也會在此被消費掉技竟,終止傳遞冰肴。
-
繪制成圖:
3. )ViewGroup2的onInterceptTouchEvent()和onTouchEvent() 都 return true的情況:**
-
也就是讓ViewGroup2攔截掉事件,并且由它自己來消費事件榔组。
-
打log:
-
規(guī)律:可以看到熙尉,當ACTION_DOWN事件在某一個View或者ViewGroup的onTouchEvent()方法中被消費掉的情況下,對應(yīng)的ACTION_UP事件也會在此被消費掉搓扯,終止傳遞检痰。
但是值得注意的是,這種情況下锨推,ACTION_UP事件是不會再經(jīng)過攔截器onInterceptTouchEvent()方法了的铅歼。
-
繪圖如下:
4.) ViewGroup2的onTouchEvent() return true的情況:**
就是讓VIewGroup2的onTouchEvent()方法在接收到View的onTouchEvent()方法傳遞過來的ACTION_DOWN事件時將其消費掉』豢桑看這種情況下谭贪,ACTION_UP事件是怎么傳遞的。
-
打Log:
規(guī)律:可以從Log看出來锦担,當ACTION_DOWN事件被某控件的onToucEvent()方法消費掉,則其對應(yīng)的ACTION_UP事件只傳遞到該控件慨削。也就是不會傳遞到比此控件更深層的控件中去洞渔。
-
繪制圖:
總結(jié)歸納
ACTION_MOVE事件與ACTION_UP事件遵循類似的規(guī)律,上面只以ACTION_UP為例子分析探究缚态。
ACTION_MOVE事件與ACTION_UP事件的傳遞分發(fā)與其對應(yīng)之前的ACTION_DOWN事件有緊密聯(lián)系磁椒。
具體的,當ACTION_DOWN事件在dispatchTouchEvent()方法中被消費玫芦,則對應(yīng)的ACTION_MOVE事件與ACTION_UP事件也會從上而下傳遞到該控件的該方法處被消費掉浆熔。
當ACTION_DOWN事件在onTouchEvent()方法中被消費,則對應(yīng)的ACTION_MOVE事件與ACTION_UP事件只傳遞到該控件處的onTouchEvent()方法中然后被消費而終止傳遞桥帆。不會經(jīng)歷該控件之下的控件的傳遞過程医增。
當所有方法都默認return super,則ACTION_MOVE事件與ACTION_UP事件會在Activity的onTouchEvent()中被消費掉。
注:【轉(zhuǎn)載請注明老虫,問題可提問叶骨,喜歡可打賞,博客持續(xù)更新祈匙,歡迎關(guān)注