深入了解事件分发

it2023-08-23  65

什么是Android事件分发:Android的view是树形结构的,view可能会重叠到一起,当我们点击重叠位置的时候,会有多个view响应这个点击事件,那这个事件到底该由谁来处理,就出现Android的事件分发。

事件分发的流程:事件分发设计到三个类,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还不处理,那么这个事件才会被销毁。

总结: 1.一个事件后,首页传递给Activity,然后一层一层往下传,从上往下调用dispatchTouchEvent方法传递事件 2.如果事件传递给最下层的View还没有被消费,就会按照反方向传给Activity,从下往上调用onTouchEvent方法,最后回到Activity的onTouchEvent方法,如果Activity也没有消费处理这个事件,这个事件就会被抛弃 3.dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后决定是自身消费还是继续往下分给子控件处理,返回true表示不继续分发,事件没有被消费;返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent方法进行判断是否拦截该事件 4.onTouchEvent方法用于事件的处理,返回true表示消费当前事件,返回false则不处理,交给子控件进行继续分发 5.onInterceptTouchEvent是ViewGroup中才有的方法,普通View是没有的,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,因为ViewGroup中可能还有子View,而Android子View是不能再包含子View的 6.上层View既可以直接拦截该事件,自己处理,也可以先询问子View,如果子View需要就交给子View处理,如果子View不需要还能继续交给上层View处理,既保证了事件的有序性,又非常的灵活 7.事件由父View传递给子View,ViewGroup可以通过onInterceptTouchEvent方法对事件拦截,停止其向子View传递 8.如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来,也就是ACTION_DOWN必须是true,之后的事件才会传递进来

最新回复(0)