Android: определить, нажимается ли область любым из пальцев - PullRequest
0 голосов
/ 23 июля 2011

У меня есть 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 ]

2 голосов
/ 25 июля 2011

В методе, описанном в вопросе, я предполагал, что полученное действие ссылается на указатель с индексом 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 голос
/ 23 июля 2011

Вам необходимо использовать константу ACTION_POINTER_INDEX_MASK .Я никогда не реализовывал это, поэтому я не знаю, как будет выглядеть код.Но я думаю, вам нужно это использовать.

...