我有ImageView
:
我需要能够旋转整个图像(圆圈和两个" 30"圆圈) 当我拖动外圈时。它应该只在我开始从外面拖动时旋转" 30"圈子
它们都应围绕中心点旋转。
当我使用View.OnTouchListener
将其拖动到任何部分并通过计算触摸事件坐标和轴心点之间的角度,然后旋转imageView时,我设法使此图像旋转。
如何检测运动事件何时仅在外圈中,以防止图像在大圆内拖动时旋转?
答案 0 :(得分:2)
在 OnTouchListener 的 onTouchEvent 方法中,如果TouchEvent在小外圈内启动,则可以使用ACTION_DOWN事件来检查。如果是这样,请将布尔值设置为true。在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将从其“零位置”旋转。最初,小圆圈处于45°和125°。将它们与ImageView的当前旋转相抵消,获得12点钟与ACTION_DOWN事件之间的角度并进行比较。还要考虑旋转点和事件之间的距离。由于您已经计算了所需的旋转,我想您知道如何确定这些角度 应从ImageView的高度和宽度计算距旋转点的正确距离,以保持密度无关。这需要一些像素计数并基于原始图像资源计算比率,手动完成。然后可以将该比率硬编码为恒定值 由于TouchEvent的位置精确到一个像素,因此您应该在计算出的小圆圈中心附近添加一些偏移量。我建议在小圆周围放一个正方形。它的边长再次根据ImageView的高度和宽度进行计算。您可以再次手动确定“有效区域”与ImageView大小的比率,并将其作为常量提供。然后你只需要检查起点的坐标是否在小圆圈中心的+/-(边长/ 2)内。