Android之事件分发机制
存在的原因
安卓上边的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件不确定该给谁,就有了事件分发机制。
Layout布局:
PhoneWindow: PhoneWindow是抽象类Window唯一的实现类,是View的实际管理容器;Window是所有视图最顶层的容器。View视图和ViewGroup外观和行为都由window管理,包括了:背景显示,标题栏和事件处理。由于Window是抽象类,所以没有办法真正的去实现,只能交给PhoneWindow来实现,所以PhoneWindow是View的实际管理容器。
DecorView: 消息传递,通过DecorView将上层消息传给下层,并通过此将下层消息传给上层。
三个重要的事件分发的方法
注:Activity和View是没有拦截事件的,Activity作为原始分发者如果拦截了事件,则整个屏幕都无法反应,而View作为事件传递最末层,要么将事件进行了销毁,要么不处理进行回传,根本不需要进行事件拦截,因为他的下面已经没有子控件了。
dispatchTouchEvent
决定了触摸事件是由自己处理还是有分发给子View,让子View来调用自己的dispatchTouchEvent来进行处理,并且调用了onInterceptTouchEvent()方法来判断是否需要拦截。
onInterceptTouchEvent
判断了是否需要拦截 :当父控件下发事件给子控件进行处理的时候,如果子控件需要处理的话,就会在此进行拦截,然后到子控件的onTouchEvent中进行触摸事件的监听和逻辑判断。
onTouchEvent
View当中的一个方法,处理传递到View的事件(按下屏幕;在屏幕上移动;抬起屏幕;取消)
注:onTouch()方法的优先级是高于onTouchEvent()的
事件分发流程
Activity->PhoneWindow->DecorView->ViewGroup->…->View
如果分发到最后一个View,没有进行事件消费,这个事件就会依次反转回到Activity,如果Activity也没有处理的话就会被抛弃(责任链模式)