Android:检测区域是否被任何手指按下

时间:2011-07-22 20:23:28

标签: android pointers touch multi-touch

我有一个SurfaceView,我正在画一个圆圈。我知道圆的位置和半径。

我需要知道用户是否按下了圆圈。用户可能正用一根或两根手指敲击屏幕。如果任何手指在圆圈区域上方,则必须按下它。

当用户从屏幕上抬起手指,并且手指不再在圆圈上方时,圆圈必须停止按下。

当用户在屏幕上只有一根手指时,我没有遇到任何问题,但是当他用两根手指时我无法解决问题。

我遇到的问题是当我收到ACTION_UP或ACTION_POINTER_UP动作时,我不知道哪个指针不再在屏幕上,所以我不必查看它们的坐标是否在圆圈上。

我做了几次尝试没有成功,最后一次是:

protected boolean checkPressed(MotionEvent event) {

    ColourTouchWorld w = (ColourTouchWorld)gameWorld;

    int actionMasked = event.getActionMasked();

    for (int i = 0; i < event.getPointerCount(); i++) {
        if (i == 0 && (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_POINTER_UP)) {
            // the pointer with index 0 is no longer on screen, 
            // so the circle is not pressed by this pointer, even if
            // it's coordinates are over the area of the circle

            continue;
        }

        if (isPointInCicle(event.getX(i)), event.getY(i))) {
           return true;
        }
    }

    return false;
}

有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:2)

在问题中写的方法中,我假设收到的动作是指向索引为0的指针。我错了,但我需要使用ACTION_POINTER_INDEX_MASK

该方法的正确实施是:

protected boolean checkPressed(MotionEvent event) {

ColourTouchWorld w = (ColourTouchWorld)gameWorld;

int actionMasked = event.getActionMasked();
int pointerIndex = ((event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT);

for (int i = 0; i < event.getPointerCount(); i++) {
    if (i == pointerIndex  && (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_POINTER_UP)) {
        // the pointer with index 0 is no longer on screen, 
        // so the circle is not pressed by this pointer, even if
        // it's coordinates are over the area of the circle

        continue;
    }

    if (isPointInCicle(event.getX(i)), event.getY(i))) {
       return true;
    }
}

return false;
}

答案 1 :(得分:1)

您需要使用ACTION_POINTER_INDEX_MASK常量。我从来没有实现过这个,所以我不知道代码的样子。但我认为你需要使用它。