Android事件分發機制,通俗易懂的讓你想點贊。

最近已經在開始準備面試了。複習了很多。把溫故而知新的知識點,用最簡白的白話文表達出來。一呢、是記錄下。二呢、萬一能幫助大家的話,更好

一、事件分發的3個重要方法

首先我隨便建了一個ViewGroup,3個重要方法是

  • dispatchTouchEvent
  • onInterceptTouchEvent
  • onTouchEvent
public class MyViewGroup extends ViewGroup {
    //...省略部分代碼
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }
}

然後對這個3個方法做下簡單的描述

方法 作用 調用時刻
dispathTouchEvent() 分發(傳遞)點擊事件 當點擊事件能夠傳遞給當前View時,該方法就會被調用
onInterceptTouchEvent() 判斷是否攔截了某事件(只存在於ViewGroup,普通View沒有這個方法) 在dispathTouchEvent()內部調用
onTouchEvent() 處理點擊事件 在dispathTouchEvent()內部調用

事件分發順序是 Activity(Window) --> ViewGroup --> View


二、放大招,分析事件分發流程。


圖中:

  • super:調用父類方法
  • true:消費事件,即事件不繼續往下傳遞
  • false:不消費事件,事件也不繼續往下傳遞 / 交由父控件onTouchEvent()處理

看着上面的圖和分析如下。總共分3個步驟:


步驟1(在Activity裏):

事件首先在Activity裏的dispatchTouchEvent()
返回值:
true / false -------> 消費事件(這裏false也是消費事件)
super -------------> 事件下發到ViewGroup,調用ViewGroup的dispatchTouchEvent()


步驟2(在ViewGroup裏)

事件在ViewGroup裏的dispatchTouchEvent()
返回值:
true --------------> 消費事件
false -------------> 不消費事件,也不下發,交給父控件的onTouchEvent()處理
super -------------> 事件下發到當前ViewGroup的onInterceptTouchEvent()

事件在ViewGroup裏的onInterceptTouchEvent()
返回值:
true --------------> 事件下發到當前ViewGroup的onTouchEvent()
false / super -----> 事件下發到子View,調用子View的dispatchTouchEvent()

事件在ViewGroup裏的onTouchEvent()
返回值:
true --------------> 消費事件
false / super -----> 不消費事件,也不下發,交給父控件的onTouchEvent()處理


步驟3(在子View裏)

事件在View裏的dispatchTouchEvent()
返回值:
true --------------> 消費事件
false -------------> 不消費事件,也不下發,交給父控件的onTouchEvent()處理
super -------------> 事件下發到當前View的onTouchEvent()

事件在View裏的onTouchEvent()
返回值:
true --------------> 消費事件
false / super -----> 不消費事件,也不下發,交給父控件的onTouchEvent()處理


看完這些分析,隨口就能來事件分發機制了!!3個步驟概況。有沒有激動的讓你點贊呢

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