您的位置:首页 > 移动开发 > Android开发

Android View 点击事件的分发机制

2016-07-21 18:18 253 查看
最近一直在研究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 。

以上就是完整的事件分发机制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息