这里只做源码分析,事件的种类,定义,传递方法都不此做赘述。
可以参考上一篇:Android部分事件分发机制篇 - 简
1、找到入口:Activity之dispatchTouchEvent()。

1,判断是否 ACTION_DOWN事件,是执行 onUserInteraction(),点进去发现,实际只是一个空方法,可以子类实现。
2,然后判断 getWindow().superDispatchTouchEvent(ev),这方法是 WIndow对象调用的,然而 PhoneWIndow是 Window对象唯一实例,因此,可以了解为 PhoneWindow之superDispatchTouchEvent(ev)。
如果true,则代表事件执行结束,不往下派发,消费掉了。如果 false,执行 onTouchEvent(ev)。
PhoneWindow之superDispatchTouchEvent(ev).

mDecor是DecorView(顶层布局),本质是一个FrameLayout。所以这里实际是调用DecorView的 superDispatchTouchEvent(event) 。我们点进去看一下。
DecorView之superDispatchTouchEvent(event)

从这里可以看到,调用了父方法,而 DecorView本质是一个 FrameLayout,是ViewGroup的子类但并没有重写。因此,我们可以看做,这里实质是调用了 ViewGroup的dispatchTouchEvent(event).,我们稍后在看 ViewGroup的方法,先理清楚 Activity事件分发书序。
综上所述,getWindow().superDispatchTouchEvent(ev) 就是执行ViewGroup 的dispatchTouchEvent(event) 。
Activity之onTouchEvent()

mWindow.shouldCloseOnTouch(this, event)通过注释了解到,用于处理发生在 Window的边界外,其他 View得不到事件。返回true时,调用 finish()结束 Activity。其他情况全都false,一律不做处理。
也就是说:一个点击事件未被 Acitivity下任何一个 View接收或处理,默认是false。只有点击到了 Window边界外才返回 true,一般用于处理 Window边界外的触摸事件。
总结:
点击事件传递入口为:Activity的dispatchTouchEvent()
传递顺序:Activity的dispatchTouchEvent() ->Window(PhoneWindow)->DecorView-> ViewGroup。如果 ViewGroup的dispatchTouchEvent=false(也就是令getWindow().superDispatchTouchEvent(ev) = false)。
那么,就会执行 Activity的OnTouchEvent(),true代表消费了事件,一般都是默认false。
网友评论