2010-04-20 6 views
6

Je me demande si le support multi-touch Android est fiable? J'ai lu qu'il souffre de quelques problèmes.Prise en charge multi-touch Android

Je me demande aussi, comment puis-je définir des gestes multi-touch personnalisés? Comme: 3 doigts tournent ou 3 doigts restent statiques et le quatrième bouge.

J'ai rencontré des ressources (Gestures ou MotionEvent sur developer.android.com) mais rien ne l'indique clairement.

Cordialement,

Zdenek

Répondre

11

J'ai fouilla dans l'API et a trouvé un moyen d'effectuer des gestes comme pincement/arrière pincement, donc je crois que les gestes que vous décrivez sont possibles - il faut juste comprendre comment les coder. Ci-dessous j'ai collé un exemple de pincée inversée que j'ai implémentée. Je voulais que le pincement ne s'inscrive que s'il est orienté horizontalement. Ce code n'est pas très propre ou réutilisable, mais il devrait vous aider à aller de l'avant. Cela fonctionne sur Android 2.0.x. J'ai lu multi-touch peut avoir des problèmes sur les versions antérieures. L'exemple est une classe que j'appelle à partir de onTouchEvent d'une activité, en transmettant l'événement à la classe.

public class HorizontalReversePinchDetector { 

    public boolean onTouchEvent(MotionEvent e) { 

     int pointerCount = e.getPointerCount(); 

     if(pointerCount != 2) { 
      Log.d(GESTURE, "not pinching - exactly 2 fingers are needed but have " + pointerCount); 
      clearPinch(); 
      return false; 
     } 

     int firstIndex = e.getX(0) < e.getX(1) ? 0: 1; 
     int secondIndex = e.getX(0) < e.getX(1) ? 1: 0; 

     Finger currentLeftFinger = new Finger(e.getX(firstIndex), e.getY(firstIndex)); 
     Finger currentRightFinger = new Finger(e.getX(secondIndex), e.getY(secondIndex)); 

     float yDifference = Math.abs(currentLeftFinger.getY() - currentRightFinger.getY()); 
     if(yDifference > 80) { 
      Log.d(GESTURE, "not pinching - fingers too vertically-oriented"); 
      clearPinch(); 
      return false; 
     } 

     if(initialLeftFinger == null) { 
      initialLeftFinger = currentLeftFinger; 
      initialRightFinger = currentRightFinger; 
      Log.d(GESTURE, "not pinching, but might be starting a pinch..."); 
      return false; 
     } 

     float leftFingerDistance = initialLeftFinger.getX() - currentLeftFinger.getX(); 
     float rightFingerDistance = currentRightFinger.getX() - initialRightFinger.getX(); 

     float xDistanceBetweenFingers = Math.abs(currentLeftFinger.getX() - currentRightFinger.getX()); 
     if(xDistanceBetweenFingers < minimumDistanceBetweenFingers) { 
      Log.d(GESTURE, "pinching, but fingers are not far enough apart..."); 
      return true; 
     } 

     if(leftFingerDistance < minimumDistanceForEachFinger) { 
      Log.d(GESTURE, "pinching, but left finger has not moved enough..."); 
      return true; 
     } 
     if(rightFingerDistance < minimumDistanceForEachFinger) { 
      Log.d(GESTURE, "pinching, but right finger has not moved enough..."); 
      return true; 
     } 

     pinchCompleted(); 
     return true; 
    } 

    private void pinchCompleted() { 
     Log.d(GESTURE, "pinch completed"); 
     if(pinchListener != null) pinchListener.onPinch(); 
     clearPinch(); 
    } 

    public static interface OnPinchListener { 
     void onPinch(); 
    } 

    private void clearPinch() { 
     initialLeftFinger = null; 
     initialRightFinger = null; 
    } 

    public void setPinchListener(OnPinchListener pinchListener) { 
     this.pinchListener = pinchListener; 
    } 

    private static class Finger { 

     private Finger(float x, float y) { 
      this.x = x; 
      this.y = y; 
     } 

     public float getX() { 
      return x; 
     } 

     public float getY() { 
      return y; 
     } 

     private float x; 
     private float y; 
    } 

    private Finger initialLeftFinger; 
    private Finger initialRightFinger; 
    private OnPinchListener pinchListener; 
    private static final float minimumDistanceForEachFinger = 30; 
    private static final float minimumDistanceBetweenFingers = 50; 
} 

En ce qui concerne la fiabilité, ce code a été complètement fiable. Encore une fois, seulement sur Android 2.0.x. Je ne l'ai pas testé sur d'autres versions de la plateforme.

+0

Parfait! Merci pour la réponse, c'est juste la chose que je cherchais. –