Проблемы с Android Multitouch - PullRequest
       21

Проблемы с Android Multitouch

2 голосов
/ 23 июня 2011

Это довольно простой вопрос, я уверен, но я не могу найти способ обойти эту маленькую вещь.Во-первых, вот мой код:

switch (event.getAction() & MotionEvent.ACTION_MASK) {

        case MotionEvent.ACTION_DOWN:
            Log.w("Platformer", "primary down");
            break;

        case MotionEvent.ACTION_UP:
            Log.w("Platformer", "primary up");
            break;

        case MotionEvent.ACTION_POINTER_1_DOWN:
            Log.w("Platformer", "secondary down");
            break;

        case MotionEvent.ACTION_POINTER_1_UP:
            Log.w("Platformer", "secondary up");
            break;
        }

Все, что я хотел, чтобы это было, когда я нажимал, в журнале показывалось, был ли выключен первичный или вторичный указатель, и когда я отпускаю, делаютоже самое.Проблема в том, что он всегда работает «вниз», но «вверх», каким бы ни был первый палец, независимо от того, был ли это первичный или вторичный указатель изначально, он возвращает, что вторичный указатель был удален.Есть идеи по этому поводу?Я предполагаю, что это что-то простое, но я не знаю, где искать правдиво.Заранее спасибо.

WWaldo

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

ACTION_UP означает, что жест завершен, то есть все указатели активны.

ACTION_POINTER_UP означает, что неосновной указатель активен, вам придется проверить событие, чтобы выяснить, какой, т.е.:

int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> 
     MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int pointerId = event.getPointerId(pointerIndex)

ACTION_POINTER_1_UP и ACTION_POINTER_2_UP устарели.

Обратите внимание, что это является ошибкой в ​​версиях Android меньше, чем Gingerbread.Я обнаружил, что, если я подниму первый из двух касаний и верну его обратно, индекс поменяется указателями и ID.Очень расстраивает.

0 голосов
/ 23 июня 2011

Используйте getPointerId , чтобы узнать, какой указатель выбирается.

Редактировать

Чтобы ответить на вопрос в комментарии, попробуйте:

    for (int i = 0; i < ev.getPointerCount(); i++) {
        switch (ev.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
            Log.d(TAG,"down "+ ev.getPointerId(i));
            break;
        case MotionEvent.ACTION_MOVE:
            Log.d(TAG,"move "+ ev.getPointerId(i));
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
            Log.d(TAG,"up "+ ev.getPointerId(i));
            break;  
        }
    }
...