我正在尝试编写应用程序代码,我只能在特定的圆形路径上移动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正在移动圆圈的一部分,而不是像我想要的那样在整个圆圈上移动。
所以我的问题:我的错在哪里?
如果您需要更多信息,请告诉我们。
答案 0 :(得分:1)
(-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。