Android View 点击事件的分发机制

最近一直在研究android的源码,理解view点击事件的分发机制,对android开发有很大的帮助。本文首先,介绍MotionEvent,然后介绍创建activity时,view是怎么创建的,最后从viewgroup 和view 出发介绍点击事件的分发机制。

MotionEvent 有三种状态
Action_Down :手指放接触屏幕
Action_Move :手指在屏幕上面移动
Action_up :手指从屏幕松开
当一个 MotionEvent 产生后,系统需要将这个事件交给一个具体的View处理,就是我们的事件分发机制。我们创建一个Activity的时候,会调用setContentView()添加xml文件,实际上是先通过Window的唯一实现类Phonewindow,获得DecorView , DecorView 一般是一个标题栏和内容块组成,而我们通过setContentView()添加的布局,实际上就是放在了DecorView的内容块上。所以点击事件发生后,传递过程是activity->window(PhoneWindow) -> DecorView -> view 。

(盗取别人一张图)
对于ViewGroup,点击事件产生后,会调用dispatchTouchEvent 、onInterceptTounchEvent 、 onTouchEvent三个方法。首先调用dispatchTouchEvent进行点击事件的分发,在这个方法中会先调用onInterceptTounchEvent 方法,判断当前的ViewGroup是否拦截这个点击事件,如何返回true,那么这个点击事件交给ViewGroup 处理,接着调用ViewGroup的onTouchEvent进行处理。默认情况下,onIterceptTounchEvent 返回为false,dispatchTouchEvent 方法就会遍历ViewGroup的所有子View,直到这个点击事件被处理。如果ViewGroup的所有子View都不处理,那么最终还是交给ViewGroup处理。
针对单个View,点击事件产生后,主要调用dispatchTouchEvent 、onTouchEvent 这两个方法。dispatchTouchEvent不再是分发点击事件,而是view判断是否处理这个点击事件,如果处理,就会调用onTouchEvent 方法。这里需要注意,如果view设置了OnTouchListener,会优先把点击事件给onTouch方法处理。所以onTouch优先于onTouchEvent 。
以上就是完整的事件分发机制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值