Android:通过拖动图像的特定部分来旋转图像
Posted
技术标签:
【中文标题】Android:通过拖动图像的特定部分来旋转图像【英文标题】:Android: Rotate image by dragging a specific part of it 【发布时间】:2017-06-23 07:25:47 【问题描述】:我有这个ImageView
:
我需要能够旋转整个图像(圆圈和两个“30”圈) 当我拖动外面的圆圈时。只有当我开始从外部“30”圈拖动时它才应该旋转
它们都应该围绕中心的点旋转。
当我使用View.OnTouchListener
将其拖动到图像的任何部分并通过计算触摸事件坐标和枢轴点之间的角度,然后旋转图像视图时,我设法使该图像旋转。
如何检测运动事件何时仅在外圈中,以防止在大圈内拖动时图像旋转?
【问题讨论】:
参考此链接andygeeks.blogspot.in/2014/05/… @mdg5435 我已经看过这个例子,但它并没有解决我的问题——我需要能够检测到触摸何时在外部圆圈之一,如果不是,我应该忽略它。 不完全理解你想要什么。但是,我在我的一个应用程序中使用了这个。它可能对你有帮助。github.com/hongyangandroid/Android-CircleMenu 【参考方案1】:在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 从它的“零位置”旋转。一开始,小圆圈是 45° 和 125°。将它们与 ImageView 的当前旋转偏移,获取 12 点钟和 ACTION_DOWN 事件之间的角度并比较它们。还要考虑旋转点和事件之间的距离。由于您已经计算了所需的旋转,我想您知道如何确定这些角度。 应根据 ImageView 的高度和宽度计算距旋转点的正确距离,因此您保持与密度无关。这需要根据原始图像资源手动进行一些像素计数和计算比率。然后可以将该比率硬编码为一个常数值。 由于 TouchEvent 的位置精确到一个像素,因此您应该在小圆圈的计算中心周围添加一些偏移量。我会推荐一个围绕小圆圈的正方形。它的边长必须再次根据 ImageView 的高度和宽度来计算。同样,您可以手动确定“有效区域”与 ImageView 大小的比率,并将其作为常数提供。然后你只需要检查起点的坐标是否在小圆圈中心的+/-(边长/ 2)内。
【讨论】:
谢谢!这似乎是正确的解决方案。我会尝试实现它并更新:) @TalMantelmakher 不客气。我刚刚添加了一些关于围绕小圆圈中心偏移的信息。以上是关于Android:通过拖动图像的特定部分来旋转图像的主要内容,如果未能解决你的问题,请参考以下文章