Android事件分发机制2
    事件分发分为捕获阶段和冒泡阶段,捕获阶段事件由外部接收传递给内层View,冒泡阶段事件由事件源的最小View开始,依次向外传递。
    Android事件传递分为分发、拦截和响应,并且在每一层可以得到控制。Activity不具有事件拦截,没有子View的ViewGroup不具有事件分发和拦截,因为它没有子View。
    OnTouch是Android系统事件机制的基础。其他事件,如OnClick和OnLongClick都是以onTouch为基础的。OnTouch事件过程分为action_down、action_move和action_up等几个步骤。
    监听OnTouch事件的两种形式:自定义View覆写onTouchEvent(MotionEvent ev)函数;调用待监听View的setOnTouchListener。两者都是在dispatchTouchEvent函数中调用,只是通过setOnTouchListener方法设置的监听器会先被调用。
    ACTION_DOWN是整个事件的起始事件,ACTION_DOWN返回false,表示继续向外冒泡,ACTION_DOWN返回true,表示该层消费掉了action_down事件,接下来的ACTION_MOVE及ACTION_UP等事件直接传给该层,而不管其返回值是false还是true,事件都不会继续冒泡到外层,事件由此被消费。
    多种监听的执行顺序问题:setOnTouchListener是最先执行的; 只有该控件完整走完ACTION_DOWN、ACTION_MOVE及ACTION_UP后,onClick才可能被执行;onLongClick只有ACTION_DOWN被按压一段时间后才可能被触发。
    函数分析
    事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
返回true,表示改事件在本层不再进行分发且已经在事件分发自身中被消费了。至此,事件已经完结。
返回 false,表明事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费。当然了,如果本层控件已经是Activity,那么事件将被系统消费或处理。
返回系统默认的 super.dispatchTouchEvent(ev),事件将分发给本层的事件拦截onInterceptTouchEvent 方法进行处理
(如果本层控件是Activity,由于其没有事件拦截,因此将直接将事件传递到子View,并交给子View的事件分发进行处理)。
    事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
    返回 true, 则表示将事件进行拦截,并将拦截到的事件交由本层控件 的 onTouchEvent 进行处理;
    返回 false, 则表示不对事件进行拦截,事件得以成功分发到子View。并由子View的dispatchTouchEvent进行处理;
    如果返回super.onInterceptTouchEvent(ev),事件默认不会被拦截,交由子View的dispatchTouchEvent进行处理。
    事件响应:public boolean onTouchEvent(MotionEvent ev)
    如果onTouchEvent返回true,表示onTouchEvent处理完事件后消费了此次事件。此时事件终结,将不会进行后续的冒泡。
    如果onTouchEvent返回false,事件在onTouchEvent中处理后继续向上层View冒泡,且有上层View的onTouchEvent进行处理。
    如果返回super.onTouchEvent(ev),则默认处理的逻辑和返回false时相同。
    总结:从以上过程中可以看出,dispatchTouchEvent无论返回true还是false,事件都不再进行分发,只有当其返回super.dispatchTouchEvent(ev),才表明其具有向下层分发的愿望,但是是否能够分发成功,则需要经过事件拦截onInterceptTouchEvent的审核。事件是否具有冒泡特是由onTouchEvent的返回值决定的。这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。
Android事件机制之一:事件传递和消费
Android事件机制之二:onTouch详解
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
--------------------- 
作者:Calvin_lhzheng 
来源:CSDN 
原文:https://blog.csdn.net/u011897062/article/details/83783884 
版权声明:本文为博主原创文章,转载请附上博文链接!
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号