2010-04-20 13 views
6

Ich frage mich, ob die Android Multi-Touch-Unterstützung zuverlässig ist? Ich habe gelesen, dass es unter einigen Problemen leidet.Android Multi-Touch-Unterstützung

Ich frage mich auch, wie kann ich benutzerdefinierte Multi-Touch-Gesten definieren? Wie: 3 Finger rotieren oder 3 Finger bleiben statisch und der vierte bewegt sich.

Ich bin auf einige Ressourcen (Gesten oder MotionEvent auf developer.android.com) gestoßen, aber nichts sagt es deutlich.

Grüße,

Zdenek

Antwort

11

Ich habe um in der API gegraben und einen Weg gefunden, Gesten wie Prise/Rück Prise, so dass ich glaube, dass die Gesten Sie beschreiben, sind möglich - es dauert nur Bezifferung heraus, wie man sie programmiert. Im Folgenden habe ich ein Beispiel für eine umgekehrte Prise eingefügt, die ich implementiert habe. Ich wollte, dass die Prise nur registriert wird, wenn sie horizontal ausgerichtet ist. Es ist nicht sehr sauber oder wiederverwendbar, aber es sollte Ihnen helfen, weiter zu kommen. Es funktioniert auf Android 2.0.x. Ich habe gelesen, dass Multi-Touch-Probleme in früheren Versionen auftreten können. Bei dem Beispiel handelt es sich um eine Klasse, die ich innerhalb der Aktivität aufruft und das Ereignis an die Klasse weiterleitet.

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; 
} 

In Bezug auf die Zuverlässigkeit ist dieser Code absolut zuverlässig. Nochmals, nur auf Android 2.0.x. Ich habe es nicht auf anderen Versionen der Plattform getestet.

+0

Großartig! Danke für die Antwort, das ist genau das, wonach ich gesucht habe. –

Verwandte Themen