2010-04-20 20 views
6

Zastanawiam się, czy obsługa wielodotykowa Androida jest niezawodna? Czytałem, że cierpi na pewne problemy.Obsługa wielodotykowych urządzeń z systemem Android

Zastanawiam się również, jak zdefiniować niestandardowe gesty wielodotykowe? Na przykład: 3 palce obracają się lub 3 palce pozostają statyczne, a czwarta porusza się.

Natknąłem się na niektóre zasoby (Gesty lub MotionEvent na developer.android.com), ale nic nie wskazuje tego wyraźnie.

Pozdrawiam,

Zdenek

Odpowiedz

11

mam grzebać w API i znaleźli sposób na wykonywanie gestów jak pinch/tył szczyptę, więc wierzę, możliwe są opisać gesty - to po prostu trwa zastanawianie jak je zakodować. Poniżej wkleiłem przykład odwrotnego uszczypnięcia, który zaimplementowałem. Chciałem, żeby szczypta się zarejestrowała, tylko jeśli jest zorientowana poziomo. Kod ten nie jest zbyt prosty ani nie nadaje się do ponownego użycia, ale powinien pomóc w poruszaniu się do przodu. Działa na systemie Android 2.0.x. Czytałem, że multi-touch może mieć problemy z wcześniejszymi wersjami. Przykładem jest klasa, którą wywołuję z poziomu działania onTouchEvent, przekazując wydarzenie do klasy.

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

Jeśli chodzi o niezawodność, kod ten jest całkowicie niezawodny. Ponownie, tylko w Androidzie 2.0.x. Nie testowałem tego w innych wersjach platformy.

+0

Świetnie! Dziękuję za odpowiedź, to jest właśnie to, czego szukałem. –

Powiązane problemy