java - 如何从两指多点触摸事件中获取旋转度数?

标签 java android android-layout

我有一个 ImageView,您可以用它来进行单指平移或两指缩放。它工作正常。我已经扩展它来处理旋转,它的行为引起了一些困惑。

当有一个多点触摸事件时,这个方法被调用,它应该返回一个以度为单位的旋转角度。它没有按照我的预期进行。

private int fingersAngle(MotionEvent event)
{
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    int degrees = (int)(Math.toDegrees(Math.atan2(y, x)));
    return degrees;
}

当我旋转两根手指时,我希望输出像...

158 166 168 169 174 176 179 181 等

但我实际得到的更像这样:

158 166 -179 179 -179 179 -179

问题似乎出在标志上。此方法如何知道它是 180 还是 -180,或者是 90 还是 -270?图像经常以错误的方式旋转,然后突然跳跃并开始以相反的方式旋转。更糟糕的是,它最初旋转的方向实际上是随机的。

我正在使用 Nexus One 测试应用程序,但在 Advent Vega 平板电脑上也遇到了同样的问题。这两款设备都可以与 3D 版 Google map 一起旋转屏幕(如果有时有点跳动),因此没有证据表明存在硬件限制。

第二个问题是,当两个手指大致垂直或水平对齐时,角度根本不会改变,因此旋转“固定”了大约 10-20 度的上/下/左/右。

目前我正在检查角度是否突然发生了巨大的变化,如果是,则从 360 度中减去它。丑陋至极,但它有一点帮助。

希望你们中的一个人以前看过这个并且知道如何从多点触控手势中提取角度旋转。

Android 中的某些事情非常简单,令人惊叹,但像这样的事情却非常痛苦。

最佳答案

为了让这项工作像用户期望的那样,您必须保持一些状态。

反正切只会告诉您两点之间的角度——系统的瞬时快照。但是您正在执行动画 - 随着时间的推移发生的事情。

因此,我认为您的“丑陋”解决方案试图检测角度的大变化,这是正确的。随着时间的推移,您真正应该跟踪的是每个手指的位置。

假设用户使用拇指和食指做手势。您需要确保他们的数字一致表示,例如拇指始终由 (x0, y0) 表示,食指始终由 (x1, y1)。

设备很可能对如何报告每个坐标有一些规则。例如,它可能总是在事件的“0”槽中报告左上坐标,在“1”槽中报告右下坐标。但是,如果用户将他们的拇指从右下角移动到左上角,您必须确保在您的代码中仍将其视为 (x1, y1)角度公式,即使设备现在在事件中将其报告为 (x0, y0)。否则,图像会快速来回翻转 180°。

如果设备不为您跟踪手指,您将不得不想出一种启发式猜测。一个简单的“先前坐标中的哪个更接近当前坐标”将是一个很好的起点,但如果事件的分辨率很差,我可以看到需要一些更奇特的东西。

关于java - 如何从两指多点触摸事件中获取旋转度数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362222/

相关文章:

android - 动画 ActionBar 的背景 (ProgressView)

android - 防止盗版的代码签名

缺少 Android Activity 识别权限

Android,如何知道我的 View 被软键盘adjustPan移动了​​多少

android - 导航栏 - 滚动时不会在 body 前面

java - 验证文件的完整性

java - Kafka Consumer 不是通过 Java 读取主题数据

java - 斐波那契递归不适用于 Java

android - 在 android 中膨胀简单的 xml 布局时出现内存不足错误

java - 无法在 jQuery 中使用 $post 将数据发送到 servlet