美文网首页
View的事件分发

View的事件分发

作者: blueizz | 来源:发表于2018-10-14 20:21 被阅读0次

    一、MotionEvent

    • ACTION_DOWN —— 手指刚接触屏幕
    • ACTION_MOVE —— 手指在屏幕上移动
    • ACTION_UP —— 手指从屏幕上松开的一瞬间

    同一个事件序列是指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以ACTION_DOWN事件开始,中间含有数量不定的ACTION_MOVE事件,最终以ACTION_UP事件结束。
    MotionEvent对象提供了获取点击事件发生的x和y坐标两组方法: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)
    在上述方法内部调用,用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件。

    public boolean onTouchEvent(MotionEvent event)
    在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件。

    上述三个方法的关系可以用如下伪代码表示:

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

    对于一个根ViewGroup来说,点击事件产生后,首先会传递给它,这时它的dispatchTouchEvent方法就会被调用,如果这个ViewGroup的onInterceptTouchEvent方法返回true就表示它要拦截当前事件,接着事件就会交给这个ViewGroup处理,即它的onTouchEvent方法就会被调用;如果这个ViewGroup的onInterceptTouchEvent方法返回false就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispatchTouchEvent方法就会被调用,如此反复直到事件被最终处理。

    点击事件的传递规则
    当一个View需要处理事件时,如果它设置了OnTouchListener,那么OnTouchListener中的onTouch方法会被回调。这时事件如何处理还要看onTouch的返回值,如果返回false,则当前View的onTouchEvent方法会被调用;如果返回true,那么onTouchEvent方法将不会被调用。由此可见,给View设置的onTouchListener,其优先级比onTouchEvent要高。在onTouchEvent方法中,如果当前设置的有OnClickListener,那么它的onClick方法会被调用。可以看出,平时常用的OnClickListener,其优先级最低,即处于事件传递的尾端。

    以上内容来源于《Android开发艺术探索》

    相关文章

      网友评论

          本文标题:View的事件分发

          本文链接:https://www.haomeiwen.com/subject/ftnzaftx.html