如何区分MotionEvent.ACTION_UP并在Android中将手指拖离屏幕?

时间:2012-10-10 00:05:14

标签: android gesture touchscreen motionevent

我的应用程序是一个边缘到边缘的按钮网格。我正在覆盖所有触摸和动作事件并手动控制行为。一切都工作正常,除了手指被拖出屏幕外。触发MotionEvent.ACTION_UP,我不希望这样。我尝试使用getRawX()和getRawY()来确定(例如,对于顶部和左边缘)坐标是否为< 1,但如果快速拖动手指,该值将更高(高达20)。触发ACTION_UP时,位置值似乎落后了一点。有没有解决的办法? ACTION_CANCEL似乎根本没有被触发。

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case (MotionEvent.ACTION_DOWN):
        Log.i(classID, "action down");
        return true;
    case (MotionEvent.ACTION_CANCEL):
        Log.i(classID, "action cancel");
        // never called
        return true;
    case (MotionEvent.ACTION_MOVE):
        Log.i(classID, "action move");
        return true;
    case (MotionEvent.ACTION_UP):
        Log.i(classID, "action up");
        Log.i(classID, "position: " + (int)event.getRawX() + "/" + (int)event.getRawY());
        return true;
    }
    return false;
}

2 个答案:

答案 0 :(得分:2)

两者之间存在物理或逻辑上没有区别(手指从屏幕上掉下来并举起手指)。当你的手指离开屏幕时,你已经“抬起”,或者,措辞更好,将手指从屏幕上移开。 MotionEvent.ACTION_UP是任何运动事件的占位符,导致没有向系统提供触摸输入数据。

如果您希望解决此问题,可以创建父视图和子视图。如果触摸从子视图“抬起”但仍在父视图中,则手指仍然在设备上但超出范围。

答案 1 :(得分:0)

他所说的关于抬起屏幕的手指和扫过边界的手指之间存在“无实质差异”查看不正确。

您可以通过在屏幕中间只有 SurfaceView 来证明这一点,并且在 OnTouch 事件回调中,有一个 IF 陈述如:

if (event.getEvent() == MotionEvent.ACTION_UP) {
         Log.d("derp", "finger has lifted up");
}

如果你的手指只是走出边界,你会发现它实际上没有报告。虽然有一个 MotionEvent.ACTION_OUTSIDE ,但我似乎无法让它发挥作用。因此,为什么我也在这里看。