6
不知Android是否支持多點觸控可靠?我讀過它有一些問題。Android多點觸控支持
我還想知道,我該如何定義自定義多點觸控手勢?例如:3個手指旋轉或3個手指保持靜止,第四個移動。
我遇到了一些資源(手勢或MotionEvent在developer.android.com),但沒有說明清楚。
問候,
茲德涅克
不知Android是否支持多點觸控可靠?我讀過它有一些問題。Android多點觸控支持
我還想知道,我該如何定義自定義多點觸控手勢?例如:3個手指旋轉或3個手指保持靜止,第四個移動。
我遇到了一些資源(手勢或MotionEvent在developer.android.com),但沒有說明清楚。
問候,
茲德涅克
我的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上。我沒有在其他版本的平臺上測試過它。
太棒了!感謝你的迴應,這只是我一直在尋找的東西。 – 2010-04-21 07:52:45