Oll*_*e C 7 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;
}
Run Code Online (Sandbox Code Playgroud)
当我旋转两根手指时,我希望输出像......
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地图来旋转屏幕(如果有时有点跳动),所以证据并不表示硬件限制.
第二个问题是,当两个手指大致垂直或水平对齐时,角度根本不会改变,因此旋转"粘住"大约10-20度的顶部/底部/左/右.
目前我正在检查角度是否突然改变了很大的数量,如果是这样的话,从360减去它.丑陋的地狱,但它有点帮助.
希望你们中的一个人之前已经看过这个,并且知道如何从多点触控手势中提取角度旋转.
Android中的一些东西是如此简单,令人惊叹,但像这样的东西是非常痛苦的.
为了使这项工作像用户期望的那样工作,您必须保留一些状态。
反正切只能告诉您两点之间的角度——系统的瞬时快照。但你正在表演一个动画——随着时间的推移而发生的事情。
所以,我认为你的“丑陋”解决方案是在正确的轨道上,试图检测角度的巨大变化。随着时间的推移,您真正应该跟踪的是每个手指的位置。
假设用户使用拇指和食指进行手势。您需要确保它们的数字一致地表示,例如,拇指始终由 (x 0 , y 0 ) 表示,食指始终由 (x 1 , y 1 ) 表示。
设备可能对如何报告每个坐标有一些规则。例如,它可能始终报告事件的“0”槽中的左上角坐标,以及“1”槽中的右下坐标。但是,如果用户将拇指从右下角移动到左上角,您必须确保在角度公式中仍然将其视为 (x 1 , y 1 ),即使设备现在将其报告为 (x 1 , y 1 ) 0 , y 0 ) 的事件。否则,图像会出现快速来回翻转 180°。
如果设备无法为你追踪手指,你就必须想出一个启发式的猜测方法。一个简单的“先前坐标中的哪一个更接近当前坐标”将是一个很好的起点,但如果事件的分辨率很差,我可以看到需要一些更奇特的东西。
| 归档时间: |
|
| 查看次数: |
4675 次 |
| 最近记录: |