View的事件体系之--View的事件分发机制



         View的事件分发机制很重要,我们的每一次Touch,每一次Click后触摸和点击事件如何被分发的,如果要自定义View或者处理滑动冲突的时候,比较系统的理解事件的分发机制都是十分必要的,也是自定义View已经解决滑动冲突相关问题的基础。


      事件的分发过程基本上是由View里的三个方法完成的,他们分别是:


      1.dispatchTouchEvent(MotionEvent ev):负责事件的分发,也就是当发生点击事件的时候第一个调的方法。


      2.onInterceptTouchEvent(MotionEvent ev):这里面可以决定是否拦截下改事件,返回true,则表示拦截,返回false则表示不拦截


     3.onTouchEvent(MotionEvent ev):当当前view如果决定拦截下事件后,就在这里面处理消耗事件


    理一理上面三个方法的逻辑:当点击事件发生时,首先会调用dipatchTouchEvent(),dipatchTouchEvent()里面首先会判断当前View的onInterceptTouchEvent(MotionEvent ev)是否拦截下了事件,如果是,则调用当前view的onTouchEvent(MotionEvent ev)来处理消耗事件,如果否,则调用child.dipatchTouchEvent()方法来把事件分发到子view中去处理,子view继续这样循环判断。


     下面就总结一下View的事件分发的过程:首先点击事件产生后第一步肯定是传递到Activity,然后传递到Window,Window再传递到顶层View(ViewGroup),然后就开始了事件在View里面的分发,可参见上面,即事件的分发是由外而内的,当父容器不拦截事件时就会传到子View,如果子view中拦截下事件,但是onTouchEvent()里面返回false,即不处理事件,那么事件会被交到父容器的onTouchEvent()去处理,如果一直这样不处理,则最终会被交到Activity的onTouchEvent()里去处理了。


    注意几点:

    1.ViewGroup里面含onInterceptTouchEvent()【即拦截事件方法】,但是默认不拦截任何事件,即默认返回false.


    2.View(与ViewGroup区分)里面是不包含onInterceptTouchEvent()方法了,因为View没有子view,如果传到他这里则不用拦截,也无法再往子view传递,所以没有必要。


    3.某个View一旦拦截下某一事件,则这一事件的所有序列(ACTION_DOWN,ACTION_MOVE,ACTION_UP)都只能由他来处理。

    4.如果我们给view设置了OnTouchListener,即重写他里面的onTouch()方法,则他的优先级比View里面的onTouchEvent()高,即事件会首先交给onTouch()里面处理,如果onTouch()里面不处理返回false,然后才会交给onTouchEvent()里面去处理,在onTouchEvent里面,如果我们给View设置了onClickListener,则在onTouEvent()里的末尾ACTION_UP里面会调用performClick()方法里面会调用他的onClick方法。所以可以看出对于事件,onTouchListener的优先级最高,然后是onTouchEvent(),最后才是onClickListener.


     

 上面就是View的事件分发机制。






你可能感兴趣的:(onTouchEvent,onclick,onTouch,事件分发机制)