【发布时间】:2012-05-27 18:18:25
【问题描述】:
我正在尝试在 android 中实现两个手指旋转,但是它并没有像预期的那样工作。目标是像谷歌地球一样实现旋转(两指围绕焦点旋转图像)。目前我的旋转监听器看起来像这样:
private class RotationGestureListener {
private static final int INVALID_POINTER_ID = -1;
private float fX, fY, sX, sY, focalX, focalY;
private int ptrID1, ptrID2;
public RotationGestureListener(){
ptrID1 = INVALID_POINTER_ID;
ptrID2 = INVALID_POINTER_ID;
}
public boolean onTouchEvent(MotionEvent event){
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
sX = event.getX();
sY = event.getY();
ptrID1 = event.getPointerId(0);
break;
case MotionEvent.ACTION_POINTER_DOWN:
fX = event.getX();
fY = event.getY();
focalX = getMidpoint(fX, sX);
focalY = getMidpoint(fY, sY);
ptrID2 = event.getPointerId(event.getActionIndex());
break;
case MotionEvent.ACTION_MOVE:
if(ptrID1 != INVALID_POINTER_ID && ptrID2 != INVALID_POINTER_ID){
float nfX, nfY, nsX, nsY;
nfX = event.getX(event.findPointerIndex(ptrID1));
nfY = event.getY(event.findPointerIndex(ptrID1));
nsX = event.getX(event.findPointerIndex(ptrID2));
nsY = event.getY(event.findPointerIndex(ptrID2));
float angle = angleBtwLines(fX, fY, nfX, nfY, sX, sY, nsX, nsY);
rotateImage(angle, focalX, focalY);
fX = nfX;
fY = nfY;
sX = nfX;
sY = nfY;
}
break;
case MotionEvent.ACTION_UP:
ptrID1 = INVALID_POINTER_ID;
break;
case MotionEvent.ACTION_POINTER_UP:
ptrID2 = INVALID_POINTER_ID;
break;
}
return false;
}
private float getMidpoint(float a, float b){
return (a + b) / 2;
}
private float angleBtwLines (float fx1, float fy1, float fx2, float fy2, float sx1, float sy1, float sx2, float sy2){
float angle1 = (float) Math.atan2(fy1 - fy2, fx1 - fx2);
float angle2 = (float) Math.atan2(sy1 - sy2, sx1 - sx2);
return (float) Math.toDegrees((angle1-angle2));
}
}
但是,当我旋转时,旋转角度会大得多,有时它会旋转到错误的一侧。有关如何解决此问题的任何想法?
顺便说一句,我在摩托罗拉 Atrix 上测试它,所以它没有触摸屏错误。
谢谢
【问题讨论】:
-
我会研究这些类:GestureDetector (source) ScaleGestureDetector (source) 它们包含一些很好的技巧来
-
ScaleGestureDetector 只能用于缩放(我已经使用该类实现了),而 GestureDetector 只能用于单点触摸手势。 Android 没有默认的旋转手势检测器。
-
您有角度问题,而不是 GestureDection 和处理问题。您报告的症状正是角度差计算错误所预期的症状。
-
pretomba,我只是建议你可以研究那些内置类的实现,看看如何很好地处理来自两个手指的事件。 Viktor,Java 有余数运算符 '%' 所以你不需要使用方法和 while 循环...
-
谢谢,将您的建议添加到我的回答中。
标签: android rotation gesture-recognition