2015-11-22 2 views
0

В моем прецеденте есть 2 значка (на сцене GL), я хотел бы обрабатывать их нажатое, удерживаемое и выпущенное состояние параллельно и независимо (с двумя пальцами).Как работает мультитач на Android?

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

@Override 
public boolean onTouch(View v, MotionEvent e) { 
    if (v != this) return false; 
    boolean down = false; 
    switch (e.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
     case MotionEvent.ACTION_MOVE: 
     case MotionEvent.ACTION_POINTER_DOWN: 
      down = true; 
      break; 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_POINTER_UP: 
     case MotionEvent.ACTION_OUTSIDE: 
     case MotionEvent.ACTION_CANCEL: 
      down = false; 
      break; 
    } 

    boolean handled = e.getPointerCount() > 0; 
    for(int i = 0; i < e.getPointerCount(); i++) { 
     e.getPointerCoords(i, coords); 
     int pointer = e.getPointerId(i); 
     if (down) { 
      scene.sizes.pixelToCm(vec, coords.x, coords.y); 
      touchMap.set(pointer, vec.getX(), vec.getY()); 
     } else { 
      touchMap.clear(pointer); 
     } 
    } 
    return true; 
} 

В этом случае, когда я нажмите и удерживайте значок A, это нормально. Затем я сохраняю значок A и нажимаю значок B, это также хорошо, оба значка нажаты. Но когда я отпускаю значок B, значок A также мгновенно освобождается.

Я полагаю, обработчик события onTouch() получает событие UP, но его список указателей (e.getPointerCount(), e.getPointerCoords()) также содержит указатели, которые DOWN.

Любой может помочь мне разрешить эту ситуацию?

ответ

0

Этот код, кажется, делать то, что я ожидал:

@Override 
public boolean onTouch(View v, MotionEvent e) { 
    if (v != this) return false; 
    for(int i = 0; i < 8; i++) 
     touchMap.clear(i); 
    if (e.getActionMasked() == MotionEvent.ACTION_UP) { 
     return true; 
    } 
    for(int i = 0; i < e.getPointerCount(); i++) { 
     e.getPointerCoords(i, coords); 
     int pointer = e.getPointerId(i); 
     scene.sizes.pixelToCm(vec, coords.x, coords.y); 
     touchMap.set(pointer, vec.getX(), vec.getY()); 

    } 
    return true; 
} 
Смежные вопросы