在Ontouchevent期间未检测到任何运动



我目前正在处理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 != newXdistance < threshold覆盖,因此您可以摆脱它。

如果onTouchEvent不发射,较棘手的部分将设置计时器。

相关内容

最新更新