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

2017-11-09  本文已影响0人  Evan_we

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,则表示不处理,不消费该事件,继续传递。

上一篇下一篇

猜你喜欢

热点阅读