Android: 通过拖动图像的特定部分来旋转图像
Android: Rotate image by dragging a specific part of it
我有这个ImageView
:
我需要能够旋转整个图像(圆圈和两个“30”圆圈)
当我拖动外面的圆圈时。只有当我从“30”圈外开始拖动时它才应该旋转
它们都应该围绕中心点旋转。
当我使用 View.OnTouchListener
将它拖动到图像的任何部分并通过计算触摸事件坐标和轴心点之间的角度,然后旋转 imageView 时,我设法使该图像旋转。
如何检测运动事件仅在外圈内,以防止在大圈内拖动时图像旋转?
在OnTouchListener的onTouchEvent方法中,您可以利用ACTION_DOWN事件来检查内部是否启动了TouchEvent小外圈。如果为真,则将布尔值设置为真。在 ACTION_MOVE 事件中,您只需检查布尔值并仅在将其设置为 true 时才旋转。然后,使用 ACTION_UP 和 ACTION_CANCEL 再次将布尔值设置为 false。
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
boolean rightPosition = false;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// When the event is in the little circles rightPosition=true
break;
case MotionEvent.ACTION_MOVE:
if(rightPosition) yourRotationCode();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
rightPosition = false;
}
return false;
}
你怎么知道拖动是否从小圆圈开始?
Tl;dr:跟踪小圆圈的极坐标并将它们与 ACTION_DOWN 事件的坐标进行比较。
要确定,如果 ACTION_DOWN 事件发生在小圆圈内,请跟踪角度,您的 ImageView 会从 'zero position' 旋转。一开始,小圆圈位于 45° 和 125°。根据 ImageView 的当前旋转偏移它们,获取 12 点钟和 ACTION_DOWN 事件之间的角度并比较它们。还要考虑旋转点和事件之间的距离。由于您已经计算出所需的旋转,我想您知道如何确定这些角度。
到旋转点的正确距离应该根据 ImageView 的高度和宽度来计算,这样您就可以保持密度独立。这需要一些像素计数和计算比率,基于原始图像资源,手工完成。然后可以将该比率硬编码为常数值。
由于 TouchEvent 的位置精确到一个像素,您应该在计算出的小圆圈中心周围添加一些偏移量。我建议在小圆圈周围画一个正方形。它的边长必须再次根据 ImageView 的高度和宽度来计算。同样,您可以手动确定 'valid area' 与 ImageView 大小的比率,并将其作为常量提供。然后你只需要检查起点的坐标是否在小圆圈中心的+/-(边长/ 2)范围内。
我有这个ImageView
:
我需要能够旋转整个图像(圆圈和两个“30”圆圈) 当我拖动外面的圆圈时。只有当我从“30”圈外开始拖动时它才应该旋转
它们都应该围绕中心点旋转。
当我使用 View.OnTouchListener
将它拖动到图像的任何部分并通过计算触摸事件坐标和轴心点之间的角度,然后旋转 imageView 时,我设法使该图像旋转。
如何检测运动事件仅在外圈内,以防止在大圈内拖动时图像旋转?
在OnTouchListener的onTouchEvent方法中,您可以利用ACTION_DOWN事件来检查内部是否启动了TouchEvent小外圈。如果为真,则将布尔值设置为真。在 ACTION_MOVE 事件中,您只需检查布尔值并仅在将其设置为 true 时才旋转。然后,使用 ACTION_UP 和 ACTION_CANCEL 再次将布尔值设置为 false。
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
boolean rightPosition = false;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// When the event is in the little circles rightPosition=true
break;
case MotionEvent.ACTION_MOVE:
if(rightPosition) yourRotationCode();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
rightPosition = false;
}
return false;
}
你怎么知道拖动是否从小圆圈开始?
Tl;dr:跟踪小圆圈的极坐标并将它们与 ACTION_DOWN 事件的坐标进行比较。
要确定,如果 ACTION_DOWN 事件发生在小圆圈内,请跟踪角度,您的 ImageView 会从 'zero position' 旋转。一开始,小圆圈位于 45° 和 125°。根据 ImageView 的当前旋转偏移它们,获取 12 点钟和 ACTION_DOWN 事件之间的角度并比较它们。还要考虑旋转点和事件之间的距离。由于您已经计算出所需的旋转,我想您知道如何确定这些角度。
到旋转点的正确距离应该根据 ImageView 的高度和宽度来计算,这样您就可以保持密度独立。这需要一些像素计数和计算比率,基于原始图像资源,手工完成。然后可以将该比率硬编码为常数值。
由于 TouchEvent 的位置精确到一个像素,您应该在计算出的小圆圈中心周围添加一些偏移量。我建议在小圆圈周围画一个正方形。它的边长必须再次根据 ImageView 的高度和宽度来计算。同样,您可以手动确定 'valid area' 与 ImageView 大小的比率,并将其作为常量提供。然后你只需要检查起点的坐标是否在小圆圈中心的+/-(边长/ 2)范围内。