为了账号安全,请及时绑定邮箱和手机立即绑定

Android:onInterceptTouchEvent和dispatchTouchEvent

Android:onInterceptTouchEvent和dispatchTouchEvent

宝慕林4294392 2019-11-04 15:30:11
onInterceptTouchEvent和dispatchTouchEventAndroid 之间有什么区别?根据android开发人员指南,这两种方法均可用于拦截触摸事件(MotionEvent),但是有什么区别?在View()层次结构中如何进行互动onInterceptTouchEvent,dispatchTouchEvent以及如何onTouchEvent互动ViewGroup?
查看完整描述

3 回答

?
牧羊人nacy

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更倾向于灵活性而不是简单性。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 716 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信