Android 移动图像视图循环

Android 移动图像视图循环,android,imageview,ontouchlistener,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_DOW

我正在尝试编写一个应用程序,我只能在特定的循环路径上移动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;
}
这是到目前为止我最喜欢的听众。高度一半和宽度一半是坐标。中心点的位置。我认为我的想法是正确的,但是现在ImageView在圆的一部分上移动,而不是像我想的那样在整个圆上移动

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

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

  • 问题是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)));

编辑:我用这段代码编写了一个小示例,效果很好。你可以找到它。

你读过数学吗。阿坦文档?不是直接的。但我也试过用弧度代替度。再检查一下我的答案。我在github上上传了一个完整的小应用程序,其中一个ImageView围绕一个圆圈移动。是的,你说得对。但我实际上不知道如何修复它。是的,当然,检查代码。从数学上讲,在每个三角形中,正弦=(对边)/斜边和余弦=(邻边)/斜边,其中“对边”和“邻边”与计算正弦/余弦的角度成反比,看来你是对的-我理解你的解。但它不起作用。ImageView正在循环路径上移动,但我不能转弯,转弯是什么意思?请准确解释这段代码的问题所在,不幸的是,我无法运行它,因为它很容易混淆。不,你的代码做得对。我在代码中发现了我的错误。我对imageview的当前位置有问题(我只是快速复制并粘贴代码)。非常感谢。