Android 事件分发机制

事件的下发

当点击事件产生后会由 Activity 来处理,传递给 PhoneWindow,再传递给DecorView,最后传递给顶层的ViewGroup。

  • 事件在ViewGroup中的处理
    首先会走进ViewGroup中的dispatchTouchEvent方法,dispatchTouchEvent方法中调用onInterceptTouchEvent方法判断是否拦截,如果拦截则交给自身的onTouchEvent方法处理。如果放回false表示不拦截,事件下发给子视图,如此反复。

  • 事件在View中的处理
    如果传递给底层的View, View是没有子View的,就会调用View的dispatchTouchEvent方法,一般情况下最终会调用View的 onTouchEvent方法。

事件的处理

如果处理事件的视图的dispatchTouchEvent方法或者onTouchEvent()方法返回true,则表示事件已被消费,流程中止。如果为false表示事件并未被处理,那么此时就会调用父视图的onTouchEvent()方法,如此反复直到遍历到最顶层的Activity。

QA
如果一个Button放在一个LinearLayout中,这个时候手指从Button上按住然后滑动到外层会不会触发Button的点击事件?

答:不会,因为点击事件最后都会在View的onTouchEvent中触发performClick(),而只有在手指抬起时,走MotionEvent.ACTION_UP里的处理时,才会走到。而这时手指已经不在Button的处理范围中,所以不会走到MotionEvent.ACTION_UP方法里。

事件 简介
ACTION_DOWN 手指 初次接触到屏幕 时触发。
ACTION_MOVE 手指 在屏幕上滑动 时触发,会多次触发。
ACTION_UP 手指 离开屏幕 时触发。
ACTION_CANCEL 事件 被上层拦截 时触发。
ACTION_OUTSIDE 手指 不在控件区域 时触发。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容