移动Imageview圆形

时间:2014-09-20 12:57:02

标签: android imageview ontouchlistener

我正在尝试编写应用程序代码,我只能在特定的圆形路径上移动Imageview。

@Override
public boolean onTouch(View view, MotionEvent event) {

    float touchedX = 0;
    float touchedY = 0;
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:  

            break;
        case MotionEvent.ACTION_UP:
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            break;
        case MotionEvent.ACTION_POINTER_UP:
            break;
        case MotionEvent.ACTION_MOVE:

            touchedX = event.getX();
            touchedY = event.getY();
            float deltaX = touchedX-widthHalf;
            float deltaY = touchedY-heightHalf;
            double angle = Math.atan(deltaY/deltaX);                        
            timeCircleButton.setX(widthHalf + ((float)(radius*(Math.cos(angle)))));
            timeCircleButton.setY(heightHalf + ((float)(radius*(Math.sin(angle)))));


            break;
    }

    return true;
}

到目前为止,这是我的onTouchListener。 HeightHalf和WidthHalf是Coord。中心点。我认为我的想法是正确的,但是现在ImageView正在移动圆圈的一部分,而不是像我想要的那样在整个圆圈上移动。

所以我的问题:我的错在哪里?

如果您需要更多信息,请告诉我们。

1 个答案:

答案 0 :(得分:1)

  • 问题是arctan函数值在(-pi/2, pi/2)

这是一个数学问题,java实现遵循数学。切线函数默认情况下不可逆,但如果将域限制为(-pi/2, pi/2),则可以将其反转。因此,反函数arctan将仅返回(-pi/2, pi/2)中的值。 java实现atan推动了这个想法,进一步定义了这个方法也在+/-无穷大(在数学上不是实数)。因此,您会看到ImageView仅在圈子的右侧移动。

解决方案:使用Math.hypot()计算斜边,然后按分部计算正弦和余弦。

touchedX = event.getX();
touchedY = event.getY();

double deltaX = touchedX - widthHalf;
double deltaY = touchedY - heightHalf;
double hypot = Math.hypot(deltaX, deltaY);
double cosine = deltaX / hypot;
double sine = deltaY / hypot;  

timeCircleButton.setX((float)(widthHalf + radius * cosine));
timeCircleButton.setY((float)(heightHalf + radius * sine)));

编辑:我用这段代码编写了一个小例子,但它确实有效。你可以找到它here