View的事件分发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27623401/article/details/79376396

一、为什么会有事件分发机制

    安卓上面的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

        

猜你喜欢

转载自blog.csdn.net/qq_27623401/article/details/79376396
今日推荐