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;

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