Android MotionEvent:查看运动是否发生在视图之外

我有一个button和OnTouchListener附加到它。 我怎样才能find运动(当用户按下button)发生内部或外部? event.getAction()和event.getActionMasked()只返回0,1或2,分别是ActionDown,ActionUp,ActionMove。 有一个不断MotionEvent.ACTION_OUTSIDE,这是4,但不知何故我没有收到它,即使我拖动button以外的button – 我仍然收到两种方法。 有什么问题?

UPD:我find了很好的解决scheme – 只需在ACTION_UP后查看焦点状态。 如果没有集中注意力,这意味着移动发生在视野之外。

Solutions Collecting From Web of "Android MotionEvent:查看运动是否发生在视图之外"

该标志只适用于Windows,而不是视图。 当您将手指从视图中ACTION_MOVE时,您将获得ACTION_MOVE ,事件将保留在“始发视图”中。 如果您需要澄清,请查看SeekBar的源代码:即使您将手指从酒吧移开,拇指仍然拖着!

为了在Window级别使用FLAG_WATCH_OUTSIDE_TOUCH ,它工作得很好。

MotionEvent.ACTION_OUTSIDE不适用于View。

一个解决scheme是获取X和Y的触摸位置,并validation它是否在视图的边界内。 它可以这样做:

 @Override public boolean onTouchEvent(MotionEvent e) { if (e.getX()<0 || e.getY()<0 || e.getX()>getMeasuredWidth() || e.getY()>getMeasuredHeight()) Log.i(TAG, "TOUCH OUTSIDE"); else Log.i(TAG, "TOUCH INSIDE"); return true; } 

如果OnTouchListenerButton ,则只会从Button接收动作事件。 MotionEvent.ACTION_OUTSIDE只会在运动事件超出View范围时被调用,并且应该像处理ACTION_UP那样对待它。

case MotionEvent.ACTION_CANCEL为我工作。

 public static boolean touchWithinBounds(MotionEvent event, View view) { if (event == null || view == null || view.getWidth() == 0 || view.getHeight() == 0) return false; int[] viewLocation = new int[2]; view.getLocationOnScreen(viewLocation); int viewMaxX = viewLocation[0] + view.getWidth() - 1; int viewMaxY = viewLocation[1] + view.getHeight() - 1; return (event.getRawX() <= viewMaxX && event.getRawX() >= viewLocation[0] && event.getRawY() <= viewMaxY && event.getRawY() >= viewLocation[1]); } 

当您从不同视图转发触摸事件时的解决scheme