View的事件分發機制

MotionEvent

    在手指接觸屏幕後所產生的一系列事件中,典型的事件類型有如下幾種:

●ACTION_DOWN——手指剛接觸屏幕;

●ACTION_MOVE——手指在屏幕上移動;

●ACTION_UP——手指從屏幕上鬆開的一瞬間;    

    觸摸屏幕觸發的一系列點擊事件:

●點擊屏幕後鬆開,事件序列爲:DOWN->UP;

●點擊屏幕滑動一會在鬆開,事件序列爲:DOWN->MOVE->...->MOVE->UP;

    MotionEvent提供兩組方法:getX/getY和getRawX/getRawY

●getX/getY——返回的是相對於當前View左上角的x和y座標;

●getRawX/getRawY——返回的是相對於手機屏幕左上角的x和y座標;

點擊事件的傳遞規則

    所謂點擊事件的事件分發,其實就是對MotionEvent事件的分發過程,即當一個MotionEvent產生了以後,系統需要把這個事件傳遞給一個具體的View,而這個傳遞的過程就是分發過程。點擊事件的分發過程由三個很重要的方法來共同完成:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。

    public boolean dispatchTouchEvent(MotionEvent ev)

    用來進行事件的分發。如果時間能夠傳遞給當前View,那麼此方法一定會被調用,返回結果收當前View的onTouchEvent和下級View的dispatchTouchEvent方法的影響,像是是否消耗當前事件。

    public boolean onInterceptTouchEvent(MotionEvent ev)

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

    public boolean onTouchEvent (MotionEvent ev)

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

    他們的關係可以用下面的僞代碼表示:

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

當一個View需要處理事件時,其方法優先級爲:onTouchListener>onTouchEvent>onClickListener;

當一個點擊事件產生後,傳遞過程遵循如下順序:Activity> Window>View;

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