gpt4 book ai didi

android - 在 onTouchEvent 期间检测到没有移动

转载 作者:行者123 更新时间:2023-11-29 02:00:26 27 4
gpt4 key购买 nike

我目前正在开发一个 Android 应用程序,该应用程序允许用户在屏幕上左右移动手指时拉 fiddle 。我希望当他们停止移动手指并且 fiddle 的琴弓停止移动时让音乐停止播放。

我正在使用典型的 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;
}

最佳答案

还有其他因素在起作用。那里seems to be大约 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 != newXdistance < threshold 涵盖, 所以你可以摆脱它。

比较棘手的部分是设置计时器以防onTouchEvent不开火。

关于android - 在 onTouchEvent 期间检测到没有移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12975968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com