一步步探索學習Android Touch事件分發傳遞機制(二)

前言

1. 探究的內容
  • 在上一篇文章《一步步探索學習Android Touch事件分發傳遞機制(一)》中,已經以ACTION_DOWN事件爲例,對Android系統的Touch事件分發傳遞機制作了探究,並得出了形象好記憶的結論。java

  • 這篇文章所探究的問題是與上一篇文章緊密相關的,若是對Android Touch事件分發傳遞機制還不太瞭解的同窗,建議先去看看上一篇文章《一步步探索學習Android Touch事件分發傳遞機制(一)》post

  • 咱們知道,一個操做,好比一個點擊事件,是由多個不一樣TYPE的MOTION_EVENT組成的。for example,點擊事件是由一個ACTION_DOWN事件和一個ACTION_UP事件組成的。那麼諸如ACTION_UP和ACTION_MOVE事件是否是跟ACTION_DOWN事件同樣遵循相同的分發規律呢?學習

  • 事實上,答案是否認的。 ACTION_UP和ACTION_MOVE事件的分發傳遞流程與這以前的ACTION_DOWN事件如何傳遞以及在哪裏被消費有密不可分的聯繫。具體咱們下面一步步探索瞭解。spa

2. 探究的方法
  • 咱們仍是繼續以上一篇文章《一步步探索學習Android Touch事件分發傳遞機制(一)》中所寫的Demo爲例子,一步步打Log,去探究整個事件的傳遞流程,再用繪圖描述他的機制。cdn

  • 固然知其然須知其因此然,對於Android源碼的分析,將會在下一篇文章《一步步探索學習Android Touch事件分發傳遞機制(三)》中分析。blog


Demo中見分曉

1.Demo代碼
2.打Log,找規律,識機制

1. )全部方法(dispatchTouchEvent(); onInterceptTouchEvent(); onTouchEvent() )都return super的狀況:get

  • 首先,咱們保持全部方法都return super,固然這個我上一篇文章探究過,ACTION_DOWN事件會以類U型的傳遞路線在View樹中分發傳遞。源碼

  • 那麼ACTION_UP和ACTION_MOVE事件呢?這裏以ACTION_UP事件爲例作探究。(事實上,Action_move事件與Action_up事件是遵循相似規律的。)我對着Demo屏幕中的View作一個點擊操做(前面交代過,點擊事件是由一個ACTION_DOWN事件和一個ACTION_UP事件組成的)。

  • 打log:

    這裏寫圖片描述
    這裏寫圖片描述

    注:上圖中,紫色框內的是點擊事件的ACTION_DOWN的分發流程;綠色框中的是點擊事件的ACTION_UP事件的分發流程。後面的圖同理。

  • 規律:能夠看到,ACTION_UP事件並無按照類U型的結構去在View樹傳遞,而是直接在Activity的onTouchEvent方法中消費掉了。

  • 繪圖以下:

    這裏寫圖片描述
    這裏寫圖片描述

2. )ViewGroup2的dispatchTouchEvent() return true的狀況:

  • 而後咱們來探究ACTION_DOWN事件在dispatchTouchEvent()中被消費掉的狀況下,ACTION_UP事件是怎麼傳遞分發的。

  • 令ViewGroup2的dispatchTouchEvent() return true,打log:

    這裏寫圖片描述
    這裏寫圖片描述

  • 規律:當ACTION_DOWN事件在某一個View或者ViewGroup的dispatchTouchEvent()方法中被消費掉的狀況下,對應的ACTION_UP事件也會在此被消費掉,終止傳遞。

  • 繪製成圖:

    這裏寫圖片描述
    這裏寫圖片描述

3. )ViewGroup2的onInterceptTouchEvent()和onTouchEvent() 都 return true的狀況:

  • 也就是讓ViewGroup2攔截掉事件,而且由它本身來消費事件。

    這裏寫圖片描述
    這裏寫圖片描述

  • 打log:

    這裏寫圖片描述
    這裏寫圖片描述

  • 規律:能夠看到,當ACTION_DOWN事件在某一個View或者ViewGroup的onTouchEvent()方法中被消費掉的狀況下,對應的ACTION_UP事件也會在此被消費掉,終止傳遞。

    可是值得注意的是,這種狀況下,ACTION_UP事件是不會再通過攔截器onInterceptTouchEvent()方法了的。

  • 繪圖以下:

    這裏寫圖片描述
    這裏寫圖片描述

  • 4.) ViewGroup2的onTouchEvent() return true的狀況:

  • 就是讓VIewGroup2的onTouchEvent()方法在接收到View的onTouchEvent()方法傳遞過來的ACTION_DOWN事件時將其消費掉。看這種狀況下,ACTION_UP事件是怎麼傳遞的。

  • 打Log:

    這裏寫圖片描述
    這裏寫圖片描述

  • 規律:能夠從Log看出來,當ACTION_DOWN事件被某控件的onToucEvent()方法消費掉,則其對應的ACTION_UP事件只傳遞到該控件。也就是不會傳遞到比此控件更深層的控件中去。

  • 繪製圖:

    這裏寫圖片描述
    這裏寫圖片描述


總結概括

  • ACTION_MOVE事件與ACTION_UP事件遵循相似的規律,上面只以ACTION_UP爲例子分析探究。

  • ACTION_MOVE事件與ACTION_UP事件的傳遞分發與其對應以前的ACTION_DOWN事件有緊密聯繫。

  • 具體的,當ACTION_DOWN事件在dispatchTouchEvent()方法中被消費,則對應的ACTION_MOVE事件與ACTION_UP事件也會從上而下傳遞到該控件的該方法處被消費掉。

  • 當ACTION_DOWN事件在onTouchEvent()方法中被消費,則對應的ACTION_MOVE事件與ACTION_UP事件只傳遞到該控件處的onTouchEvent()方法中而後被消費而終止傳遞。不會經歷該控件之下的控件的傳遞過程。

  • 當全部方法都默認return super,則ACTION_MOVE事件與ACTION_UP事件會在Activity的onTouchEvent()中被消費掉。

注:【轉載請註明,問題可提問,喜歡可收藏分享,博客持續更新,歡迎關注】

相關文章
相關標籤/搜索