Android触摸方向西北,东北方向为UP方向

时间:2012-04-04 18:57:17

标签: android math android-layout

很抱歉,如果标题听起来令人困惑 - 但这就是我想要做的事情:

我有一个大的圆形按钮,我在其上检测触摸方向。我可以从触摸输入坐标变化的dy和dx中找到UP / DOWN / LEFT / RIGHT,如下所示:

          if(Math.abs(dX) > Math.abs(dY)) {
              if(dX>0) direction = 1; //left
              else direction = 2; //right
          } else {
              if(dY>0) direction = 3; //up
              else direction = 4;   //down
          }

但是现在我想处理按钮可以稍微旋转的情况,因此触摸方向也需要调整。例如,如果按钮稍微向左旋转,则UP现在是手指向西北移动而不是纯北移动。我该如何处理?

1 个答案:

答案 0 :(得分:2)

使用 Math.atan2(dy,dx)从弧度坐标的正水平方向逆时针获取角度

double pressed = Math.atan2(dY, dX);

从该角度减去旋转量(以弧度为单位的逆时针旋转量),将角度放入按钮的坐标系中

pressed -= buttonRotation;

或者如果您的角度为度,请将其转换为弧度

pressed -= Math.toRadians(buttonRotation);

然后,您可以从此角度计算更简单的方向编号

int dir = (int)(Math.round(2.0d*pressed/Math.PI) % 4);

这给出了正0,向上1,向左2和向下3.我们需要纠正角度为负的情况,因为模数结果也是负数。

if (dir < 0) {
    dir += 4;
}

现在假设这些数字很糟糕并且你不想使用它们,你可以直接打开结果以返回你喜欢的每个方向。 将所有内容放在一起

/**
 * @param dY
 *      The y difference between the touch position and the button
 * @param dX
 *      The x difference between the touch position and the button
 * @param buttonRotationDegrees
 *      The anticlockwise button rotation offset in degrees
 * @return 
 *      The direction number
 *      1 = left, 2 = right, 3 = up, 4 = down, 0 = error
 */
public static int getAngle(int dY, int dX, double buttonRotationDegrees)
{
    double pressed = Math.atan2(dY, dX);
    pressed -= Math.toRadians(buttonRotationDegrees);

    // right = 0, up = 1, left = 2, down = 3
    int dir = (int)(Math.round(2.0d*pressed/Math.PI) % 4);

    // Correct negative angles
    if (dir < 0) {
        dir += 4;
    }

    switch (dir) {
        case 0:
            return 2; // right
        case 1:
            return 3; // up
        case 2:
            return 1; // left;
        case 3:
            return 4; // down
    }
    return 0; // Something bad happened
}