场景描述:
当老板有一个问题需要解决的时候,他可以自己直接解决,也可以将问题交给经理去解决,当然老板不可能所有问题都要自己解决,那样还要经理和员工干什么,所以老板一般会将任务派发给经理,一般经理也不会自己解决,他会将问题派发给员工去解决,员工嘛就是干活的,否则就得走人了,当然不排除有些问题员工没有能力解决那只能将问题返回给经理,经理有能力解决就解决了,如果经理也解决不了,那就把这个问题扔回给老板,最后只能由老板自己解决了。
类似地:
我们的View的事件分发也是这样的,当我们手接触到手机屏幕的时候,屏幕接收到一个Touch事件,系统会将这Touch事件封装成一个对象MotionEvent,之后所有的事件处理都将与这个MotionEvent相关,和领导派发任务一样,我们的Touch事件会首先到达最外层的ViewGroup(Activity),然后再一层一层地向子View派发,最终会到达最内层的View,最内层的View可以处理这个Touch事件,也可以将这个Touch事件扔回给自己的父View
什么是Android事件分发:
Android的view是树形结构的,view可能会重叠到一起,当我们点击重叠位置的时候,会有多个view响应这个点击事件,那这个事件到底该由谁来处理,就出现Android的事件分发。
事件分发的本质
事件分发的本质,其实就是将点击事件(MotionEvent)传递到某个具体的View处理的整个过程
事件分发的顺序
Activity->Window->DecorView->ViewGroup->View。一个点击事件发生后,总是先传递给当前的Activity,然后通过Window传给DecorView再传给ViewGroup,最终传到View。
事件分发的三个主要对象:
一个事件产生之后,都是先传给Activity,在传给ViewGroup,最后传给View,对比上面的例子,Activity对应的就是项目经理,viewGroup就是你的老大,而你就相当于view了;
三个重要方法:
事件分发流程:
事件分发设计到三个类,activity、viewgroup、view,三个重要 方法,dispatchTouchEvent()、onTouchEvent()、onInterceptTouchEvent();当用户点击了屏幕,事件先传递到Activity中,Activity通过调用自己的dispatchTouchEvent将事件分发到phoneWindow,phonewindow则会调用superdispatchTouchEvent方法,superdispatchTouchEvent方法内部调用内部类DecorView的superdispatchTouchEvent,而DecorView又会调用dispatchTouchEvent去进行事件分发,如果不拦截事件,那么就会继续下传到rootview,rootview中的操作是一样的,同样在dispatchTouchEvent内部调用onInterceptTouchEvent去判断是否拦截,不拦截就会把事件分发给下一个viewgroup,拦截就直接在onTouchEvent返回true,viewgroup中做的判断也是一样,最后事件传递到view,view是最底层控件,不会有onInterceptTouchEvent,它的选择就只有处理或不处理,处理就在onTouchEvent进行处理并返回true,不处理的话事件也不会被销毁,会把事件回传给viewGroup,viewGroup也可以选择处理或不处理,处理就在onTouchEvent进行处理并返回true,不处理的话就回传给activity,如果Activity还不处理,那么这个事件才会被销毁。