Android MotionEvent:查看视图外是否发生了动作

Yur*_*yak 8 android motion-detection

我有一个按钮和OnTouchListener附加到它.如何查找运动(当用户按下按钮时)是在内部还是外部发生?event.getAction()和event.getActionMasked()都只返回0,1或2,分别是ActionDown,ActionUp,ActionMove.有一个常量的MotionEvent.ACTION_OUTSIDE,它是4,但即使我在按钮外拖动触摸,我也不会收到它 - 我仍然从这两种方法中获得2.有什么问题?

UPD:我找到了很好的解决方案 - 只需在ACTION_UP之后检查焦点状态.如果它没有聚焦,则意味着移动发生在视图之外.

Tom*_*Tom 8

该标志仅适用于Windows,而不适用于视图.ACTION_MOVE当您将手指移离视图时,您将获得该事件,该事件将保留在它所源自的视图中.SeekBar如果您需要澄清,请查看源代码:即使您将手指从杆上移开,拇指仍会拖动!

为了在Window级别使用FLAG_WATCH_OUTSIDE_TOUCH,它可以正常工作.


Ari*_*Dov 7

case MotionEvent.ACTION_CANCEL 为我工作.


Der*_*rzu 6

MotionEvent.ACTION_OUTSIDE不适用于View.

一种解决方案是获取X和Y触摸位置并验证它是否在视图的边界内.它可以这样做:

@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;
}
Run Code Online (Sandbox Code Playgroud)