View的事件分发

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

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

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值