
查看源码,dispatchTouchEvent方法时发现:
1、当action是按下的时候(也就是当事件刚开始的时候)会调用onUserInteraction方法,而内部并无具体实现——所以在事件刚开始时可以实现这个方法用于监听事件开始。
2、当获取上层view的superDispatchTouchEvent方法返回是true的时候就消费掉这个事件,否则就传给onTouchEvent处理。(符合上一节说的流程)
3、 Activity+Window+DecorView之间的关系:每个Activity都持有一个window对象,window本身是一个抽象类,有一个唯一的实现PhoneWindow,PhoneWindow持有了一个DecorView的实例,DecorView是Activity最顶层的View,他继承自FrameLayout。
4、FrameLayout继承自ViewGroup,FrameLayout要实现的superDispatchTouchEvent方法在VIewGroup中实现了。
onUserInteraction在手指按下时会立即调用,可以通过重写该方法监听整个触摸事件的开始。
PhoneWindow{
// This is the top-level view of the window, containing the window decor. private DecorView mDecor;
}
每个Activity持有Window窗体,而Window是个抽象类,其唯一的实现类是PhoneWindow,所以Window的
superDispatchTouchEvent
方法就是调用PhoneWindow的DispatcherToucherEvent方法,,实现的调用DecorView的 SuperDispatcherToucherEvent方法(PhoneWindow持有DecorView)。DecorView继承自FrameLayout(内部没有实现SuperDispatcherToucherEvent方法),FrameLayout继承自ViewGroup(实现SuperDispatcherToucherEvent方法)。
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event);
},
Activit 将MotionEvent分发给PhoneWindow,
PhoneWindow将MotionEvent分发给DecorView;
DecorView将MotionEvent调用父类中的dispatchTouchEvent方法,最终使事件进入到ViewGroup->View的分发流程中
FrameLayout 继承自ViewGroup
FrameLayout 中没有覆写superDispatchTouchEvent方法,所以DecorView 对象调用的super.dispatchTouchEvent 方法实际上是调用的ViewGroup的dispatchTouchEvent方法
PhoneWindow的superDispatchTouchEvent(MotionEvent ev){
return mDecor.superDispatchTouchEvent(ev);
}
PhoneWindow的事件分发实际上是调用了内部所只有的最顶层的DecorView(FrameLayout类) mDecor的事件分发方法
Android 中Window类的唯一实现类是PhoneWindow
使用Activity的onUserInteraction()来监听一个触摸事件的开始,
该方法只会在MotionEvent.ACTION_DOWN的类型下执行