我有一个父视图组,里面有一个子视图。我注意到触摸事件期间的一些行为与我关于如何调度触摸事件的心理模型不同。
视图组 A 占据整个屏幕,视图 B 以编程方式添加到 A(使用 A.addView(B))并且仅占据屏幕的一部分。对于 A 和 BI 都覆盖 onTouchEvent(MotionEvent event) 方法,但仅此而已。
如果我将手指触摸到屏幕并在视图 B 的范围内抬起它,我注意到触摸事件直接路由到 B 的 onTouchEvent() 方法,而没有点击 A 的 onTouchEvent() 方法。B 接收 DOWN、MOVE 和 UP 动作,并为每个动作返回 true。
如果然后我用手指触摸屏幕并在 Viewgroup A 的范围内但在 View B 的范围之外抬起,那么我看到的行为违反了我关于如何调度触摸事件的心理模型。当我这样做时,视图 B 再次在其 onTouchEvent() 中接收到 DOWN、MOVE 和 UP 操作,即使 B 没有被点击。我本来希望 A 收到这些动作。如果我然后用我的手指做完全相同的动作(在 A 内部但在 B 外部触摸和抬起),那么 A 的 onTouchEvent() 会按预期接收 DOWN、MOVE 和 UP 动作。
就好像在其中一个 View 接收到触摸事件后,系统将其设置为接收下一次触摸,而不管触摸的位置如何。
有什么基本的我不明白吗?
此外,我的一个资源提到我需要在我的视图组/视图中手动管理命中测试,以确定视图组何时收到命中,是否应该将命中分派给孩子。这对我来说是有道理的,但是,在我提到的第一种情况下,系统似乎已经为我做到了,因为点击会自动发送给孩子。哪个是正确的做法,让系统处理还是自己处理命中逻辑?
我使用这些资源让我走到了这一步,但它们似乎没有明确涵盖这一点:
http://codetheory.in/understanding-android-input-touch-events/ https://guides.codepath.com/android/Gestures-and-Touch-Events