2017-06-16 3 views
0

J'ai un problème dans mon application où j'ai besoin d'effectuer une action différente basée sur si un doigt ou deux doigts sont enfoncés.Android 2 doigt tactile déclenchement 1 doigt tactile ainsi que 2 tactile

Actuellement, j'ai le code de suivi:

@Override 
    public boolean onTouchEvent(MotionEvent event){ 
     int touchX = (int)event.getX(); 
     int touchY = (int)event.getY(); 
     int action = event.getActionMasked(); 

     //Multitouch 
     if(event.getPointerCount() > 1 && action == MotionEvent.ACTION_POINTER_DOWN){ 
      System.out.println("2 Finger press"); 

      return true; 
     } 
     else if(action == MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_POINTER_DOWN){ 

      if(event.getPointerCount() == 1) { 
       System.out.println("single finger down"); 
       invalidate(); 
       return true; 
      } 
     } 

     return false; 
    } 

La question que j'ai est quand je presse avec 2 doigts, les registres de pièces multitouch, et après que le fait de la presse unique.

J'ai fait quelques recherches sur les moyens de résoudre ce problème et c'est pourquoi je vérifie sur le simple contact conditionnel que action != MotionEvent.ACTION_POINTER_DOWN que je pensais régler le problème. Cela n'a pas résolu le problème, donc j'ai décidé de vérifier cela event.getPointerCount() == 1, mais malheureusement, cela provoque toujours les deux lignes à imprimer lorsque je presse avec 2 doigts.

Pour résumer, je n'ai besoin d'appeler la partie à 2 doigts que lorsque 2 doigts sont enfoncés et pas les deux.

Répondre

1

se référer à la documentation sur "Handling Multi-Touch Gestures". il détaille exactement ce que vous cherchez.

En substance, chaque pointeur actif se voit attribuer un ID lorsqu'il entre en contact avec l'écran. votre solution devrait prendre en compte les ID qui entrent en jeu et sont supprimés en observant les différents états d'action.

quelque chose d'un peu le long de ces lignes (mais méfiez-vous des appels de compatibilité pour les méthodes comme getActionIndex()):

CODE MISE À JOUR EXEMPLE

public class MotionActivity extends AppCompatActivity { 

    private int primaryPointerId = -1; 
    private int secondaryPointerId = -1; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(new FrameLayout(this)); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
     int action = event.getActionMasked(); 

     switch(action) { 
      case MotionEvent.ACTION_DOWN: 
       primaryPointerId = event.getPointerId(0); 

       Log.d(getClass().getName(), "Primary pointer ID == [" + primaryPointerId + "]"); 

       break; 

      case MotionEvent.ACTION_POINTER_DOWN: 
       secondaryPointerId = event.getPointerId(event.getActionIndex()); 

       Log.d(getClass().getName(), "Secondary pointer ID == [" + secondaryPointerId + "]"); 

       break; 

      case MotionEvent.ACTION_MOVE: 
       if(primaryPointerId > -1 && secondaryPointerId > -1) { 
        Log.d(getClass().getName(), "Two-point touch..."); 
       } else { 
        Log.d(getClass().getName(), "One-point touch..."); 
       } 

       break; 

      case MotionEvent.ACTION_POINTER_UP: 
       if(event.getPointerId(event.getActionIndex()) == primaryPointerId) { 
        primaryPointerId = secondaryPointerId; 
       } 

       secondaryPointerId = -1; 

       break; 

      case MotionEvent.ACTION_UP: 
       primaryPointerId = -1; 

       break; 
     } 

     return true; 
    } 
} 
+0

Je vais devoir relire la documentation sur ce point et travailler comment le faire. Je crois que votre code d'échantillon est faux, cependant, il n'enregistre pas du tout 2 doigts. Je pense que cela est dû à secondaryPointerId = -1, ce qui signifie que le conditionnel multi-touch n'est jamais atteint – kalenpw

+0

'secondaryPointerId' doit être attribué lorsqu'une action de' MotionEvent.ACTION_POINTER_DOWN' est reçue. mes mécaniciens sur la façon de référencer l'index d'action correcte peuvent être désactivés (j'ai écrit cela hors de la mémoire), mais l'essentiel est correct. Si 'secondaryPointerId' == -1 c'est parce qu'il y a un (ou aucun) doigt sur la surface. – hsl

+0

Je l'ai regardé plus et le problème est le 'cas MotionEvent.ACTION_POINTER_DOWN' n'est jamais réellement entré et je dois encore comprendre pourquoi, mais à part cela, je pense que c'est correct. Je vois ce que vous voulez dire sur le secondaryPointerId – kalenpw