事件分发

事件分发三个方法:

    1 )dispatchTouchEvent()

            作用:分发(传递点击事件)

            调用时刻:事件能传递给当前View时,该方法调用。             

     2 )onTouchEvent()

            作用:处理点击事件

            调用时刻:在dispatchTouchEvent()内部调用

     3)onInterceptTouchEvent()   

            作用:判断是否拦截了某个事件(只存在ViewGroup,普通的View无该方法)         

            调用时刻:在ViewGroup的dispatchTouchEvent()内部调用。


事件分发顺序:   

    Activity -->  ViewGroup -- > View        


事件分发本质:

    将点击事件传递到某个具体的View,并且这个View处理,消费掉的过程就是事件的传递过程也就是分发过程。


事件类型:

        ACTION-DOWN:按下View(所有事件的开始)

        ACTION-UP:抬起View(对应Down)

        ACTION-MOVE:滑动View

        ACTION-CANCEL:结束时件(非人为)


事件列:

        从触摸屏幕到手指离开屏幕的过程产生的一系列事件,一般情况下,事件列都是DOWN事件开始,UP事件结束,中间有无数个MOVE事件。


事件分发步骤:

    如果事件都不消费的话,是这样的:      

      从activity的dispatchTouchEvent() --> ViewGroup的dispatchTouchEvent() --> ViewGroup的 onInterceptTouchEvent() --> View的dispatchEvent -- > View的onTouchEvent() -- > ViewGroup的onTouchEvent() -- > Activity的onTouchEvent();


       当dispatchTouchEvent() 和 onTouchEvent()是true,事件就消费没了,如果是false,事件就回溯到父控件的onTouchEvent,说明自己不处理,对activity来说,dispatchTouchEvent()返回true或false事件都会消失,因为activity是最顶层的事件接受者,而ViewGroup和View返回super,则是向下传递,返回false,就是向父控件的onTouchEvent()回溯事件,onTouchEvent返回super,代表向上回溯事件,返回false,就代表自己不想处理,也是向上回溯事件,如果最终都没有消费,则activity消费,事件消失。所有方法的super,就是保证让整个事件流程走完。

        在ViewGroup中的onInterceptTouchEvent(),默认返回super,通过源码能看出来其实就是返回false,默认是不拦截的,这样就能让View去捕捉事件,如果onInterceptTouchEvent()返回true,则代表拦截这个事件,交给ViewGroup的onTouchEvent()处理,ViewGroup的dispatchTouchEvent()的super,默认实现就是调用自己的拦截事件,这就保证事件有机会到自己的onTouchEvent()。

dispatchTouchEvent()与 onTouchEvent()都是以down事件为基准来判断后续事件是否经过自己,也就是自己消费,如果down事件返回了false或者super,则后续事件都不在经过自己,包括move和up,只有true的时候,后续事件才会经过自己。   


简单来说,就是当点击手机屏幕时,会产生一个事件,这个事件会先传递给activity,activity会调用它的dispatchTouchEvent(),将事件传递给phoneWindow,phoneWindo会调用它的superdispatchTouchEvent,在这个方法中,会调用它内部类decorView的superdispatchTouchEvent()进行事件分发,如果不拦截,就会把事件下发到rootView,rootView中的操作也是一样,同样在dispatchTouchEvent()中使用onInterceptTouchEvent(),去判断是否拦截,如果不拦截就会下发到下一个ViewGroup,如果拦截,就在onTouchEvent()返回true,ViewGroup中的操作也是一样,最后事件传递到View,View是底层控件,如果没拦截方法,没有拦截方法,只能选择处理或者不处理,如果处理,就在onTouchEvent()中返回true,事件消费,如果不拦截,就把事件回传到ViewGroup,ViewGroup也可以选择处理或者不处理,如果处理就在onTouchEvent()返回true,如果不处理就将事件返回给activity,如果activity也不出来,那么事件就消费。

你可能感兴趣的:(事件分发)