围绕中心点旋转视图

时间:2015-12-21 23:36:23

标签: android matrix rotation

我已经得到了我认为是一个简单的问题,但解决方案却让我望而却步。这个问题的前提很简单:我有一个视图(称之为点)与中心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()是我想要旋转的更大圆圈的坐标。

我非常感谢这里的一些帮助。这个问题一直困扰着我一天。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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);
}