Android:通过拖动图像的特定部分来旋转图像

时间:2017-02-06 11:10:56

标签: android imageview draggable image-rotation

我有ImageView

enter image description here

我需要能够旋转整个图像(圆圈和两个" 30"圆圈) 当我拖动外圈时。它应该只在我开始从外面拖动时旋转" 30"圈子

它们都应围绕中心点旋转。

当我使用View.OnTouchListener将其拖动到任何部分并通过计算触摸事件坐标和轴心点之间的角度,然后旋转imageView时,我设法使此图像旋转。

如何检测运动事件何时仅在外圈中,以防止图像在大圆内拖动时旋转?

1 个答案:

答案 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)内。