Android進階學習之路——View事件的傳遞機制

原理饒口令:事件階段兩步走、向下分發、向上傳遞、分發可攔截先分發,後傳遞,事件消費不傳遞

事件分發中重要的方法
  1. dispatchTouchEvent                分發事件(只要觸摸控件,就會調用控件的DispathTouchEvent方法)
  2. onInterceptTouchEvent           攔截事件
  3. OnTouch                                 View類的抽象方法,讓調用者去setOntouchListener的時候實現的方法
  4. onTouchEvent                         View類自己的方法,複寫View的時候,自己去覆蓋父類的OnTouchEvent方法。

ViewGroup事件分發原理:
  1. 當點擊屏幕的時候,獲取手指在屏幕上的位置,然後調用當前Activity根佈局ViewGroup的dispatchTouchEvent方法。
    1. 判斷disallowIntercept(是否禁用掉攔截功能,默認false)或(!oninterceptTouchEvent(ev))爲true   (事件攔截):分發階段
      1. 判斷當前手指的點是否位於ViewGroup的子結點上(View或ViewGroup),
        1. 如果是則調用子結點的DisaptchTouchEvent方法                                   (事件向子控件分發):分發階段

    2. 如果不是則調用自己父類(View)的DisapchTouchEvent方法,自己來消費當前事件,如果自己不消費當前事件,
      則將事件傳遞至父控件進行處理,如果父控件也不處理,繼續向上傳遞。                               :傳遞階段

      代碼詳解




View的事件分發處理:
  1. 當自己的DisaptchTouchEvent方法被調用的時候
            
            如果OnTouch返回True,那麼就不會執行當前類的OnTouchEvent方法了。
        如果當前方法返回true,表示消費掉當前的事件,那麼事件也就不會再向上傳遞了。

  2. OnTouchEvent詳解


事件分發有幾點需要理清楚的知識點:
  1. 事件分發中的View和ViewGroup區別。ViewGroup僅僅是負責事件分發的,和事件的傳遞。向子控件分發事件還是被傳遞從而調用自身(父類)的DispatchToucheEvent方法。 
  2. 觸摸到了任何一個控件,就一定會調用該控件的dispatchTouchEvent方法
  3. 如果子控件dispatchTouchEvent一直返回false,表示不消費當前的事件,那麼之後事件會向上傳遞。
  4. touch事件的層級傳遞: 如果在執行ACTION_DOWN時返回false,後面一系列其它的action就不會執行。簡單的說:當dispatchTouchEvent時行事件分發的時候,只有前一個Action返回true。纔會觸發後一個Action。    下面是示意圖

            


FLY:以上是自己在學習的過程中所做的筆記,如果有錯誤的言論或者有沒說明白的歡迎評論。咱們共同學習、共同進步


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章