[英]Android multi-touch support
我想知道Android多点触控支持是否可靠? 我读过它有一些问题。
我也想知道,如何定义自定义多点触摸手势? 如:3根手指旋转或3根手指保持静止,而第四根手指在移动。
我遇到过一些资源(developer.android.com上的手势或MotionEvent),但没有明确说明。
问候,
兹德内克
我在API中进行了深入研究,找到了一种执行诸如捏合/反向捏合之类的手势的方法,因此,我相信您所描述的手势是可能的-它只是弄清楚如何编写它们。 在下面,我粘贴了一个实施的反向捏合示例。 我希望捏只在水平方向上才注册。 它不是很干净或可重用的代码,但是它应该可以帮助您前进。 它适用于Android2.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上。 我尚未在平台的其他版本上进行过测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.