2010-04-20 153 views
6

不知Android是否支持多點觸控可靠?我讀過它有一些問題。Android多點觸控支持

我還想知道,我該如何定義自定義多點觸控手勢?例如:3個手指旋轉或3個手指保持靜止,第四個移動。

我遇到了一些資源(手勢或MotionEvent在developer.android.com),但沒有說明清楚。

問候,

茲德涅克

回答

11

我的API在周圍挖,發現執行手勢像捏/反向捏的方式,所以我相信你所描述的手勢是可能的 - 它只是需要搞清楚瞭解如何對它們進行編碼。下面我貼了一個我實現的反向捏的例子。我希望捏只是註冊如果它是水平的。它不是很乾淨或可重用的代碼,但它應該可以幫助你繼續前進。它適用於Android 2.0.x.我已閱讀多點觸控可能在早期版本中存在問題。這個例子是我從一個活動的onTouchEvent中調用的一個類,將該事件轉發給該類。

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

關於可靠性,此代碼已完全可靠。再次,只在Android 2.0.x上。我沒有在其他版本的平臺上測試過它。

+0

太棒了!感謝你的迴應,這只是我一直在尋找的東西。 – 2010-04-21 07:52:45