【问题标题】:Detect no movement during onTouchEvent在 onTouchEvent 期间检测到没有移动
【发布时间】:2012-10-10 04:04:05
【问题描述】:

我目前正在开发一个 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;   
}

【问题讨论】:

    标签: android touch-event


    【解决方案1】:

    还有其他因素在起作用。 seems to be 的默认触摸“斜率”约为 10px。这意味着onTouchEvent 不会为低于该阈值的任何内容触发。因此,您需要确定它们是否在完全不依赖onTouchEvent 的情况下被停止。一种方法是在每次运行时设置一个lastTouched 来设置时间,并运行一个计时器循环来检查它与当前时间的对比。

    现在,如果您想要一个高于 10 像素的阈值,您还必须自己安排。比如:

    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 &gt; 0 没有多大意义,因为移动无关紧要。检查oldX != newX 被distance &lt; threshold 覆盖,所以你可以摆脱它。

    更棘手的部分是设置计时器,以防onTouchEvent 不触发。

    【讨论】:

    • 你能解释一下“棘手的部分”是如何完成的吗?假设我们将计时器设置为定期运行例程。我们如何在例程中获取 X 和 Y?在使用onTouch的时候,我们可以调用event.getX()和event.getY(),但是如果我们在没有任何事件的情况下周期性地调用自己的例程怎么办呢?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多