为触摸的自定义绘图提供圆周运动:Android

时间:2013-12-14 15:40:22

标签: android user-interface ondraw

我有一个自定义绘制的矩形,我希望根据触摸事件在圆形路径中移动。 它遵循顺时针或逆时针运动的触摸方向,但基本上以圆周运动方式移动,就好像在圆的边缘上移动一样。

我目前的思考过程如下: 根据用户当前和之前的x,y i将找到以度为单位的角度,然后通过在新位置重新绘制将该矩形移动相同的角度,只需确保它在圆的边缘上移动。 但这会导致以下一些混淆: 1.我如何确定角度移动是顺时针还是逆时针。 我无法正确地弄清楚这一点。

这是最好的方法,还是有更好的想法呢? 此外,如果这是最好的方法,有人可以告诉我计算角度的公式,我应该在照顾时钟和逆时针的同时移动它吗?

有人可以帮忙吗? 如果需要更多细节,请告诉我。 感谢

2 个答案:

答案 0 :(得分:2)

步骤

当用户点击并按住到圆圈侧面时,可以通过以下几个步骤将矩形沿着圆圈移动:
  1。获得所需的方向   2. 从当前x和y坐标获取角度   3. 添加方向(逆时针方向为+1,顺时针方向为-1)为角度   4。计算新的x和y坐标   5. 更新/显示矩形。

详细信息

1。在伪代码中,direction = sign(Rectangle1.x - UsersFingerPosition.x)。这里sign是一个函数,如果数字是负数则返回-1,如果是0则返回0,如果是正数则返回1。请注意,只有当用户位于矩形位置的精确x和y时,才会生成sign(0)。在这种情况下,矩形不会移动(这应该是好的)。在Java中,符号函数是Math.signum()

2. 要获取当前角度,请使用以下java代码:

double angle = Math.toDegrees(Math.atan2(Circle.y-Rectangle1.y, Rectangle1.x-Circle.x));

请注意Circle.y-Rectangle.yRectangle.x...Circle.x的顺序。这是坐标(0,0)位于左上角而不是屏幕中心的结果。

3。很简单,只需添加角度方向即可。如果需要,可以执行类似

的操作
angle += direction*2; //So it will move more quickly

4. 要获取矩形的新x和y坐标,请使用三角函数正弦和余弦:

Rectangle1.x = Math.cos(Math.toRadians(angle))*Circle.radius + Circle.x - Rectangle1.width;
Rectangle1.y = Math.sin(Math.toRadians(angle))*Circle.radius + Circle.y - Rectangle1.height;

(其中Circle.x和Circle.y是圆心的坐标,Circle.radius自然是半径)。

5. 这个你必须照顾(或已经):)!

希望这能帮到你!

答案 1 :(得分:1)

步骤

以下几步是为了沿着圆圈移动矩形:
  1。获取手指位置/检查它是否仍在拖动矩形   2. 从当前x和y坐标获取角度   3。计算新的x和y坐标   4. 更新/显示矩形。

详细信息

1。这个可能特定于您的代码,但是,请确保当用户开始拖动矩形时,您将rectangleDragging之类的变量设置为true 。在运行后续步骤(在代码中)之前,请检查rectangleDragging == true。一旦用户离开,将其设置为false

2. 要获取当前角度,请使用以下java代码:

double angle = Math.toDegrees(Math.atan2(Circle.y-Finger.y, Finger.x-Circle.x));

请注意Circle.y-Finger.yFinger.x...Circle.x的顺序。这是坐标(0,0)位于左上角而不是屏幕中心的结果。

3. 要获取矩形的新x和y坐标,请使用三角函数正弦和余弦:

Rectangle1.x = Math.cos(Math.toRadians(angle))*Circle.radius + Circle.x - Rectangle1.width;
Rectangle1.y = Math.sin(Math.toRadians(angle))*Circle.radius + Circle.y - Rectangle1.height;

(其中Circle.x和Circle.y是圆心的坐标,Circle.radius自然是半径)。减去矩形的宽度和高度应该将其放在圆圈的边框上,而不是将左上角放在圆圈上。

4. 这个你必须照顾(或已经):)!

希望这能帮到你!