View的事件分发
2018-02-26 15:50
155 查看
一、为什么会有事件分发机制
安卓上面的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件应该给谁呢?为了解决这个问题就有了事件分发机制。图中,当我们点击View1的时候位于他下方的ViewGroupA和黑色的RootView都是能够响应的,为了能够确定到底是哪个View来处理这个点击事件,这里就引入了事件分发机制。
PhoneWindow:上方图中的标题和其他空白区是现实在DecorView中的,Window是一个抽象类,是属于所有视图容器的最顶层的管理容器,所有的View、ViewGroup的外观和行为都归他管,比如背景的显示,标题栏,事件的处理。由于Window是一个抽象类,就必须要有一个实现类来替他完成这些工作,这个实现类就是PhoneWindow。PhoneWindow作为Window的唯一实现类他就是View的管理事件容器,不过PhoneWindow是通过他的内部类DecorView来进行消息传递的。
DecorView:作为PhoneWindow的内部类,它负责PhoneWindow和下面的View进行消息传递的。PhoneWindow通过指示DecorView将信息传递给下面的View,而下面的View同样通过DecorView把信息返回给PhoneWindow。
二、三个重要的事件分发的方法
我们一直说的事件传递、事件分发、事件处理到底是个怎样的过程他具体的流程就是通过下面的三个方法来完成的。(Activity和View是没有第二个onInterceptTouchEvent拦截方法的,他们分别属于整个事件分发流程的头和尾。因为Activity作为整个事件的原始分发者,如果Activity拦截了事件就会导致整个屏幕都无法响应事件。而View作为事件传递最末端,要么将事件消费掉要么不处理回传,因为他下面没有View要处理了)1、dispatchTouchEvent:事件分发方法,他是决定了是由自己的onTouchEvent方法消费还是分发给子View让子View的dispatchTouchEvent来处理。
2、onInterceptTouchEvent:判断是否拦截某个事件(只存在ViewGroup,View中没有这个方法)在ViewGroup的dispatchTouchEvent内部调动的。
3、onTouchEvent:处理事件(MotionEvent.ACTION_DOWN、MotionEvent.ACTION_UP、MotionEvent.ACTION_MOVE、MotionEvent.ACTION_CANCEL),在dispatchTouchEvent内部调用的
三、事件分发的总体流程
Activity->PhoneWindow->DecorView->ViewGroup->...->View相关文章推荐
- View的事件分发
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
- Android View的事件分发机制
- android ViewGroup事件分发机制
- View的事件分发机制学习笔记
- Android View 事件分发机制 源码解析
- 学习过程中遇到很好的博客去学习-Handler详解(超棒)-View事件分发机制(解决ViewPager的滑动冲突)
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
- View事件分发机制
- View相关 Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- 学习View事件分发笔记(二)
- Android----View事件分发机制(一)
- 《Android View 的事件分发和滑动冲突》 —预习资料
- 从ViewPager嵌套RecyclerView再嵌套RecyclerView看安卓事件分发机制
- 学习ViewGroup事件分发笔记(一)
- Android View、ViewGroup 事件分发机制(二)
- Android--触摸屏事件分发--View
- Android自定义View总结(二)事件分发机制
- android view的事件分发机制
- 通俗理解Android中View的事件分发机制及滑动冲突处理