Android事件分發機制機制

Android事件分發機制

(一)點擊事件的傳遞規則

所謂的點擊事件分發其實就是MotionEvent事件的分發,即當一個MotionEvent產生之後,系統需要把這個事件傳遞給具體的View,而這個事件傳遞過程就是事件分發,點擊事件分發過程由三個很重要的方法來完成:

public boolean dispatchTouchEvent()

用來進行事件分發,如果事件能夠傳遞給當前View,那麼此方法一定會被調用,返回結果受當前View的onTouchEvent和下級的dispatcheTouchEvent方法的影響,表示當前事件是否被消費

public boolean onInterceptTouchEvent()

在上述方法中調用,用來判斷是否攔截某個事件,如果當前View攔截了某個事件,那麼在同一個事件序列當中,此方法不會被再次調用,返回結果表示事件是否攔截

public boolean onTouchEvent()

在dispatchTouchEvent方法中調用,用來 處理點擊事件,返回結果表示是否消費事件,如果不消耗,則在同一個事件序列中,當前View無法再次接收到事件

上述方法有什麼區別呢?我們採用僞代碼來體現

  public boolean dispatchTouchEvent(MotionEvent ev) {

        boolean consume = false;
        if (onInterceptTouchEvent(ev)) {
            consume = onTouchEvent(ev);
        } else {
            consume = child.dispatchTouchEvent(ev);
        }
       return consume;
    }

即在一次事件分發的過程中,判斷當前view(viewGroup)是否攔截,如果攔截,則交給onTouchEvent進行處理,如果不攔截,則交給子view的dispatchTouchEvent處理,至此完成一輪事件的分發。

通過上面代碼我們已經將三個方法的關係體現的酣暢淋漓,我們也可以對事件傳遞的規則有一個明確的認知,對於一個根ViewGroup來說:產生事件後首先傳遞它,這時dispatchTouchEvent 會調用ViewGroup的ViewGroup的onInterceptTouchEvent返回true就表示攔截當前事件,接着事件會交給ViewGroup處理,即onTouchEvent會被調用ViewGroup的onInterceptTouchEvent返回false表示不攔截事件,這個事件會傳遞給子元素,接着子元素的dispatchTouchEvent會被調用.

Touch事件分發圖

這裏寫圖片描述

(二)事件分發總結

1.同一個事件序列是從手指接觸屏幕那一刻開始,到手指離開屏幕那一刻結束。
2.正常情況下,一個事件序列只能被一個View攔截且消耗
3.某個View一旦決定攔截,那麼這個事件序列只能它來處理,它的onInterceptTouchEvent不會再被調用
4.某個View一旦開始,如果它不消耗ACTION_DOWN 事件即onTouchEvent返回來false,那麼同一事件序列中的其它事件都不會再交給它來處理。
5.如果不消耗ACTION_DOWN以外的事件,那麼這個點擊事件會消失,此時父元素的onTouchEvent並不會被調用,並且當前View回持續收到後續事件,最後這些消失的事件會傳遞個給Activity處理
6.ViewGroup默認不攔截事件onInterceptTouchEvent默認返回fakse
7.View 沒有onInterceptTouchEvent,一旦事件傳遞給View,onTouchEvent就會被調用
8.View的onTouchEvent默認消耗事件,返回true,除非它不可點擊 clickable和longClickable同時爲false;View的longClickable默認未false,clickable要分情況;
9.View的enable屬性不影響onTouchEvent的默認值返回。
10.onClick 會發生的前提是當前View是可點的,並收到down 和up 事件
11.事件傳遞過程是由外向內的,事件總是先傳遞給父元素再由父元素分發給子元素。
12.事件傳遞:activity > Window > view

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