Android中的onInterceptTouchEvent
和dispatchTouchEvent
有什么区别?
根据android开发人员指南,这两种方法都可以用来拦截触摸事件(MotionEvent
),但是有什么区别呢?onInterceptTouchEvent
,dispatchTouchEvent
和onTouchEvent
在 View 层次结构(ViewGroup
)中如何相互作用?
最佳答案
最好的解密方法是源代码。该文档不足以解释这一点。
dispatchTouchEvent实际上是在Activity,View和ViewGroup上定义的。 将其视为决定如何路由触摸事件的 Controller 。
例如,最简单的情况是 View.dispatchTouchEvent ,它将定义触摸事件到 OnTouchListener.onTouch (如果已定义)或扩展方法 onTouchEvent 。
对于 ViewGroup.dispatchTouchEvent ,事情要复杂得多。它需要确定其 subview 中的哪一个应该获取事件(通过调用child.dispatchTouchEvent)。这基本上是一种 HitTest 算法,您可以确定哪个 subview 的边界矩形包含接触点坐标。
但是在将事件分派(dispatch)到适当的 subview 之前,父级可以一起监视和/或拦截事件。这就是InterceptTouchEvent 上的的用途。因此,它会在进行点击测试之前先调用此方法,并且如果事件被劫持(通过从onInterceptTouchEvent返回true),则会向 subview 发送 ACTION_CANCEL ,以便他们可以放弃触摸事件处理(从以前的触摸事件开始),并从然后,父级上的所有触摸事件都会被分派(dispatch)到 onTouchListener.onTouch (如果已定义)或 onTouchEvent ()。同样在这种情况下,永远不会再次调用onInterceptTouchEvent。
您甚至要覆盖[Activity | ViewGroup | View] .dispatchTouchEvent吗?除非您正在执行一些自定义路由,否则您可能不应该这样做。
如果要在父级监视和/或拦截触摸事件,则主要扩展方法是ViewGroup.onInterceptTouchEvent,并使用View.onTouchListener/View.onTouchEvent进行主事件处理。
总而言之,它的设计imo过于复杂,但android API更倾向于灵活性而不是简单性。