美文网首页
View事件分发机制的简要笔记

View事件分发机制的简要笔记

作者: Evan_we | 来源:发表于2017-11-09 16:39 被阅读0次

    1.点击事件的三个重要方法:

    dispatchTouchEvent(MotionEvent ev)--用来进行事件的分发。如果当前事件能够传递给当前view,那么此方法一定会被调用。

    onInterceptTouchEvent(MotionEvent ev)--用来进行时间的拦截。返回结果表示是否拦截当前事件。(在dispatchTouchEvent()中调用,#view没有提供这个方法)

    onTouchEvent(MotionEvent ev)--用来处理点击事件。(在dispatchTouchEvent()中调用)

    2.View的分发机制:

    1.当点击事件产生以后,事件首先会传递给当前的Activity,调用其Activity的dispatchTouchEvent()方法,处理工作交给Activity的PhoneWindow来完成,PhoneWindow把工作交给DecorView,DecorView再拔事件处理交由ViewGroup。 Activity→PhoneWindow→DecorView→ViewGroup

    2.当ViewGroup要拦截时间的时候。那么后续的时间也会交由他处理,而不再调用onInterceptTouchEvent()的方法了。

    3.onInterceptTouchEvent()方法默认返回false,不进行拦截。如果想要让ViewGroup拦截事件那么需要在自定义VIewGroup中重写这个方法。

    4.View的onTouchEvent()默认都会消费事件(返回为true),除非它是不可点击(clickable和longClickable同时为false)。

    5.onInterceptTouchEvent()和onTouchEvent()方法都在dispatchTouchEvent方法中调用。

    6.如果某个View一决定拦截,那么它的onInterceptTouchEvent()方法不会再被调用,同一事件的其他方法都交给它处理。

    7.一般在事件传递中只回考虑ViewGroup的onInterceptTouchEvent()方法,因为一般不会重写dispatchTouchEvent()方法,如果ViewGroup的onInterceptTouchEvent()方法返回为ture,则表示要拦截该事件,就会交由onTouchEvent()方法处理。返回为false,表示不拦截这个事件。则会交给它的子元素dispatchTouchEvent()来处理,如此反复下去。

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

    所以可以得出结论:为true,则表示处理了,消费了该事件,不继续传递,为false,则表示不处理,不消费该事件,继续传递。

    相关文章

      网友评论

          本文标题:View事件分发机制的简要笔记

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