我有一个图像及其在imageView中。我想添加一个功能,如果用户尝试将图像旋转到右侧,则允许用户旋转图像。例如,如果用户尝试将图像旋转到左侧,则它不会旋转。
这是我的转轮。
我尝试使用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)
这是基于答案伪代码的代码实现。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
}
}
旁注:我认为如果猛击是水平的,上面的代码将表现得不自然。如果您希望旋转手势更真实,我认为计算切向分量会更好。
编辑:这是计算切向分量的方式。
您可能需要计算在触摸事件所在的点处速度矢量在圆的单位切线上的标量投影。
伪代码:
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欧几里得向量旋转)。
tangentVector = (-normalVector.y, normalVector.x)
unitTangent = tangentVector / tangentVector.length()
最后,使用点积获得标量投影:
scalarProjection = velocityVector.dotProduct(unitTangent)
= (velocityVector.x * unitTangent.x) + (velocityVector.y * unitTangent.y)
如果scalarProjection
为正,则表示甩动手势为顺时针方向。如果为负,则表示手势为逆时针方向。
另外,由于我们使用单位切线,因此标量投影还表示顺时针旋转的速度,因此您可以将旋转动画更改为更快或更慢,或设置阈值以使该方向不会触发车轮旋转。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句