2015-12-21 99 views
0

我已经得到了我认为是一个简单的问题,但解决方案无法解决我的问题。这个问题的前提很简单:我有一个视图(称之为一个点)与中心vx,vy我想旋转一个更大的圆圈cx,cy。我研究过使用sin,cos,radians,atan2,所有这些爵士乐,但由于某种原因,当我旋转我的视图时,它看起来好像是在椭圆形而不是圆形中旋转。数学为此避开了我。围绕一个中心点旋转视图

我有什么到目前为止:

public void update(double matrixAngle) 
     double angleInDegs = Math.toDegrees(mAngle); 
     double newAngle = (matrixAngle > 0) ? angleInDegs + matrixAngle : angleInDegs - matrixAngle; 
     double angleInRads = Math.toRadians(newAngle); 

     float dx = itemCircle.getCenterX() - getCenterX(); 
     float dy = itemCircle.getCenterY() - getCenterY(); 
     double radius = Math.sqrt(dx * dx + dy * dy); 

     float x = (float) (getCenterX() + radius * Math.cos(angleInRads)); 
     float y = (float) (getCenterY() - radius * Math.sin(angleInRads)); 

     itemCircle.setCenterX(x); 
     itemCircle.setCenterY(y); 

对于一些澄清:该方法的

matrixAngle参数是用于旋转整个视图中的矩阵角。范围从0-180,然后从-180到0,其中0从圆圈的右侧打开。

mAngle是视图被绘制的原始角度。它的范围从0到360.

itemCircle是代表视图边界的圆圈。它是一个圆圈(确切地说是一个扩展的FloatingActionButton)。

getCenterX(), getCenterY()是我想要旋转的大圈的坐标。

我真的很感谢这里的帮助。这个问题一直困扰我一整天。

+0

可能是你可以尝试对象动画师。 –

+0

这就是问题所在。我会的,但我需要更新每个视图的触摸坐标(我将使用它的'itemCircle'),因为我需要让它们响应点击事件并激发我的点击侦听器。 –

回答

0

明白了。参与更仔细地观察cos,sin角度以实现我想要的。工作代码:

public void update(double matrixAngle) { 
     double angleInRads = Math.toRadians(matrixAngle); 

     double cosAngle = Math.cos(angleInRads); 
     double sinAngle = Math.sin(angleInRads); 

     float dx = mItemCircle.getCenterX() - getCenterX(); 
     float dy = mItemCircle.getCenterY() - getCenterY(); 

     float rx = (float) (dx * cosAngle - dy * sinAngle); 
     float ry = (float) (dx * sinAngle + dy * cosAngle); 

     rx += getCenterX(); 
     ry += getCenterY(); 

     mItemCircle.setCenterX(rx); 
     mItemCircle.setCenterY(ry); 
} 
0

由于像素不是正方形,因此您的对象正在以椭圆形状移动。请注意,在DisplayMetrics类中,xdpiydpi实际上有不同的值。你需要调整你的计算来解决这个问题。

+0

我该怎么做呢?修改'getCenter()'方法来说明正确的像素密度? –