Android - 如何旋转图像

问题描述

我有一个图像,它在 imageView 中。我想添加一个功能,如果用户尝试将其旋转到右侧,则允许用户旋转图像。例如,如果用户尝试将其旋转到左侧,则它不会旋转。

enter image description here

这是我的旋转轮。

我尝试使用 GestureDetector 和 onFling 事件,但不足以检测用户是否尝试将其旋转到右侧或左侧。我该怎么做?

编辑:

            var normalVectorX = e2?.x!! - 515
            var normalVectorY = e2?.y!! - 515

            var tangentVectorX  = -normalVectorY
            var tangentVectorY = normalVectorX

            var tangentVectorLength = (Math.sqrt(Math.pow((515 - e2?.y!!).todouble(),2.0)) + Math.pow((e2?.x!! - 515).todouble(),2.0))

            var unitTangentX = tangentVectorX / tangentVectorLength
            var unitTangentY = tangentVectorY / tangentVectorLength

            var scalarProjection = (veLocityX * unitTangentX) + (veLocityY * unitTangentY)

            if (scalarProjection > 0) // Right Side
                spinWheel((spinCountX * 360).toFloat() + 360 - (mPrizeIndex * 60),12000)

这是基于answer伪代码代码实现。 515 = 轮子的中心。

解决方法

onFling 为您提供相应甩动手势的 MotionEvent。然后您可以调用 getX(int)getY(int) 来获取坐标。

public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) {
  float x = e2.getX(0);  // Assuming you only care about the first finger
  float y = e2.getY(0);
  if (x < imageView.getWidth() / 2) {
    // fling is on the left side
  } else {
    // fling is on the right side
  }
}

旁注:我认为如果投掷是水平的,上面的代码会表现得不自然。如果您希望旋转手势更逼真,我认为最好计算 tangential component

编辑:以下是计算切向分量的方法。

您可能想要计算触摸事件所在点圆的单位切线上的速度矢量 scalar projection

伪代码:

velocityVector = (velocityX,velocityY)
locationOfTouch = (e2.getX(0),e2.getY(0))
centerOfWheel = (166,155)  # Measured from your image
normalVector = locationOfTouch - centerOfWheel
             = (locationOfTouch.x - centerOfWheel.x,locationOfTouch.y - centerOfWheel.y)

为了得到顺时针切向量,我们取法线向量,交换 X 和 Y 分量,并取反 X(来自 2D Euclidean vector rotations)。

tangentVector = (-normalVector.y,normalVector.x)
unitTangent = tangentVector / tangentVector.length()

最后,你用点积得到标量投影:

scalarProjection = velocityVector.dotProduct(unitTangent)
                 = (velocityVector.x * unitTangent.x) + (velocityVector.y * unitTangent.y)

如果 scalarProjection 为正,则表示甩动手势为顺时针方向。如果为负,则表示手势为逆时针方向。

作为奖励,由于我们使用了单位切线,因此产生的标量投影也代表了顺时针方向的甩动速度,因此您可以将旋转动画更改为更快或更慢,或者设置一个阈值,使得那个方向的小速度不会触发轮子旋转。

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...