3 回答
TA贡献1862条经验 获得超7个赞
最好的解密方法是源代码。该文档不足以解释这一点。
dispatchTouchEvent实际上是在Activity,View和ViewGroup上定义的。将其视为决定如何路由触摸事件的控制器。
例如,最简单的情况是View.dispatchTouchEvent,它将触摸事件路由到OnTouchListener.onTouch(如果已定义)或扩展方法onTouchEvent。
对于ViewGroup.dispatchTouchEvent,事情要复杂得多。它需要确定其子视图中的哪个应获取事件(通过调用child.dispatchTouchEvent)。这基本上是一种命中测试算法,您可以确定哪个子视图的边界矩形包含接触点坐标。
但是在将事件分派到适当的子视图之前,父级可以一起监视和/或拦截事件。这就是onInterceptTouchEvent的用途。因此,它会在进行点击测试之前先调用此方法,如果事件被劫持(通过从onInterceptTouchEvent返回true),则会向子视图发送ACTION_CANCEL,以便他们可以放弃对触摸事件的处理(从先前的触摸事件开始),然后再取消父级的所有触摸事件都将分派到onTouchListener.onTouch(如果已定义)或onTouchEvent()。同样在这种情况下,永远不会再次调用onInterceptTouchEvent。
您甚至要覆盖[Activity | ViewGroup | View] .dispatchTouchEvent吗?除非您正在执行一些自定义路由,否则您可能不应该这样做。
如果要在父级监视和/或拦截触摸事件,则主要扩展方法是ViewGroup.onInterceptTouchEvent,并使用View.onTouchListener / View.onTouchEvent进行主事件处理。
总而言之,它的设计imo过于复杂,但android API更倾向于灵活性而不是简单性。
添加回答
举报