gpt4 book ai didi

android - 移动Imageview循环

转载 作者:行者123 更新时间:2023-11-30 02:39:51 26 4
gpt4 key购买 nike

我正在尝试编写一个应用程序,我只能在特定的圆形路径上移动 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 是坐标。的中心点。我认为我的想法是正确的,但是现在 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)));

编辑:我用这段代码编写了一个小示例,它可以正常工作。你可以找到它here .

关于android - 移动Imageview循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25949004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com