2

我的应用程序是一个边到边的按钮网格。我正在覆盖所有触摸和运动事件并手动控制行为。一切正常,除了手指被拖出屏幕外。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;
}
4

2 回答 2

2

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

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

于 2012-10-10T00:38:51.640 回答
0

他所说的手指从屏幕上抬起和手指滑出视图边界之间没有“物理差异”的说法是不正确的。

您可以通过在屏幕中间放置一个SurfaceView来证明这一点,并且在OnTouch事件回调中,有一个IF语句,例如:

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

您会看到,如果您的手指只是超出了边界,它实际上并没有报告。虽然有一个MotionEvent.ACTION_OUTSIDE,但我似乎无法让它工作。因此,为什么我也在寻找这里。

于 2012-10-29T22:35:01.337 回答