我有一个按钮和OnTouchListener连接到它。我如何找到如果议案(当用户按下按钮时)发生在内部还是外部?两个事件。getAction()和事件.getActionMasked()只返回0、1或2,分别为ActionDown、ActionUp、ActionMove,有一个常量MotionEvent.ACTION_OUTSIDE,为4,但不知何故,即使我将touch拖到按钮之外,我也没有收到它-我仍然从两种方法收到2。
**UPD:**我找到了一个很好的解决方案--在ACTION_UP之后检查视图的聚焦状态。如果它没有聚焦,这意味着移动发生在视图之外。
7条答案
按热度按时间tyky79it1#
MotionEvent.ACTION_OUTSIDE不适用于视图的。
一种解决方案是获取X和Y触摸位置,并验证其是否在视图的边界内。
ar7v8xwq2#
该标志仅适用于Windows,不适用于视图。当您将手指从视图上移开时,您将得到
ACTION_MOVE
,事件仍保留在其起源的视图中。如果需要澄清,请查看SeekBar
的源代码:即使你把手指从吧台上移开,拇指还是会拖!要在窗口级别执行此操作,请使用
FLAG_WATCH_OUTSIDE_TOUCH
,它工作得很好。ibrsph3r3#
case MotionEvent.ACTION_CANCEL
对我很有效。xriantvc4#
如果
OnTouchListener
位于Button
上,则只能从Button
内接收运动事件。只有当运动事件首次超出View
的边界时,才会调用MotionEvent.ACTION_OUTSIDE
,并且应将其视为ACTION_UP
。juud5qan5#
从不同视图转发触摸事件时的解决方案
z9zf31ra6#
试试这个
};
ui7jx7zq7#
下面是一个Kotlin扩展函数,您可以从触摸监听器中使用它来检查所提供的事件是否在给定的视图中: