我目前正在处理Android应用程序,该应用程序允许用户在屏幕上向左和向右移动小提琴时,可以玩小提琴。我想让音乐停止移动手指,而小提琴的弓停止移动。
我正在使用典型的OnTouchEvent来捕获运动手势,现在我想知道检测用户的最佳方法是用户仍在触摸屏幕,但没有移动他们的手指。
这是我目前的代码,具有极其意大利面功能以检测运动量,这遇到了以下两个问题:
1:当用户从左到右移动时,它将将其注册为没有移动的一秒钟并停止声音。
2:不可能完全握住您的手指,我需要允许少量动作。
任何人都可以提出正确的方法来检测缺乏运动比下面的运动吗?
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
audio.start();
bowImage.setY(430);
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
float posX = event.getX();
if ( detectValidMovement(posX) ) {
bowImage.setX(posX);
audio.start();
} else {
audio.pause();
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
audio.pause();
}
return true;
}
private boolean detectValidMovement(float posX) {
int newX = Math.round(posX);
if (oldX > 0) {
int distanceMoved = newX - oldX;
if (oldX != newX) {
oldX = newX;
return true;
} else {
oldX = newX;
return false;
}
} else {
oldX = newX;
}
return false;
}
还有其他因素正在发挥作用。似乎有一个默认的触摸"斜率"约为10px。这意味着onTouchEvent
在该阈值下不会发射任何东西。因此,您需要找出是否完全依靠onTouchEvent
停止。一种方法是每次设置lastTouched
设置时间时设置时间,并运行计时器循环以在当前时间进行检查。
现在,如果您想要高于10px的阈值,则还必须自己安排。类似:
final int threshold = 25;
private boolean detectValidMovement(float posX) {
int newX = Math.round(posX.getX());
double distance = Math.abs(newX - oldX);
oldX = newX;
if(distance < threshold)
return false;
return true;
}
请注意使用Math.abs()
检查两个方向,这仅检查X运动。我以为这是您从代码示例中关注的全部。
这实际上就是您所需的一切。检查oldX > 0
没什么意义,因为运动无关紧要。检查oldX != newX
由distance < threshold
覆盖,因此您可以摆脱它。
如果onTouchEvent
不发射,较棘手的部分将设置计时器。