彻底搞清Android事件分发机制

先来搞清楚Activity的布局是怎么创建的。

Activity创建的时候会初始化一个继承Window的PhoneWindow对象,当Activity的onCreate()方法中调用setContentView()方法时,实际调用了PhoneWindow的addContentView()方法,此时PhoneWindow创建了一个DocerView对象mContentParent,这个对象相当于整个Activity的ViewRoot,创建完DocerView对象后就把setContentView()传过来的view对象addView到mContentParent对象中,完成整个Activity布局的创建。

当产生一个触摸事件时,事件先传到Activity,然后Activity调用分发事件方法dispatchTouchEvent,如果返回true,则事件就会传给Activity的第一个父控件。

父控件拿到事件后,也会调用分发事件方法dispatchTouchEvent,如果返回true,则继续调用拦截方法onInterceptTouchEvent,如果返回true,则父控件拦截了事件,并调用父控件的onTouchEvent方法,下面的子控件就不会再响应onTouchEvent,onTouch的方法。

子控件拿到事件之后,先判断是否设置了OnTouchListener, 如果设置了,则调用OnTouchListener的onTouch方法,如果返回true,事件已经处理到此结束,则跳过onTouchEvent方法,否则调用onTouchEvent方法,当onTouchEvent方法返回true,则事件处理到此结束,上面的父控件就不会再调用onTouchEvent方法。

如果某一个控件响应了ACTION_DOWN事件,则后续的ACTION_MOVE、ACTION_UP事件就会直接交给该控件处理,除非它的父控件拦截了后续的事件,但可以在处理ACTION_DOWN事件时,调用requestDisallowInterceptTouchEvent禁止父控件的拦截。如果控件没有处理ACTION_DOWN事件,则后续的事件就不会再传到该控件中,当下一次的ACTION_DOWN事件产生时,还是会传给该View的。

你可能感兴趣的:(彻底搞清Android事件分发机制)