使用加速度计时出现逻辑问题

时间:2016-07-19 15:03:22

标签: java android accelerometer

我正在努力创建一个类似于&#34的应用程序;抬起头来"只是为了更多的锻炼!!

但是现在我在我的应用程序中使用加速度计遇到了一些逻辑问题。

我想要应用程序干杯"更正"当它向下倾斜时(加速度计在这个位置给出-7)和吐司"错误"当倾斜向上时(加速度计在此位置给出7或更多)。

但问题是app在每个位置反复多次举杯。所以我使用了一个布尔值(isToasted)来使应用程序在每个位置都进行一次吐司。但现在它根本没有吐司!

我的问题在哪里,我该怎么办?

这是我的代码的一部分:

Boolean isToasted = false;

@Override
public void onSensorChanged(SensorEvent event) {
    int sensorValue = (int) event.values[2];

    while (isToasted) {
        switch (sensorValue) {
            case 7: {
                Toast.makeText(find_word2.this, "wrong", Toast.LENGTH_SHORT).show();
                isToasted = true;
                break;
            }
            case -7: {
                Toast.makeText(find_word2.this, "correct", Toast.LENGTH_SHORT).show();
                isToasted = true;
                break;
            }
        }
    }
    if (sensorValue == 0) isToasted = false;  //sensorValue = 0 means device is not tilted and it's in direct position.
}

2 个答案:

答案 0 :(得分:0)

  

do-while和while之间的区别在于do-while计算   它的表达式位于循环的底部而不是顶部。   因此,do块中的语句总是在执行时执行   至少一次。

答案 1 :(得分:0)

在每个位置多次显示Toast的原因是因为SensorEvent可以在一个位置multiple times出现:

  

请注意"已更改"有点用词不当,因为这也是   如果我们从传感器获得完全相同的新读数,则调用   传感器值(但是更新的时间戳)。

因此,每当SensorEvent具有您在switch语句中指定的z值之一时,将显示Toast。通过添加boolean值来跟踪消息是否已经显示,您处于正确的轨道上,但是while循环将永远不会执行,因为isToasted设置为false }。

实际上,你甚至不需要循环。您所要做的就是检查z值是否在两个值的范围之间。如果是,则将boolean设置为true。如果没有,则检查boolean是否为真且z值是否高于或低于该范围。然后,您可以相应地设置Toast,并将boolean设置为false,以便第二次不显示该消息。

private boolean isReset = true;
private float mMaxValue = 7;
private float mDeadZone = 5;

@Override
public void onSensorChanged(SensorEvent event) {
    float value = event.values[2];

    if(value >= mDeadZone || value <= -mDeadZone) {
        if(isReset && value <= -mMaxValue) {
            Toast.makeText(find_word2.this, "correct", Toast.LENGTH_SHORT).show();
            isReset = false;
        } else if(isReset && value >= mMaxValue) {
            Toast.makeText(find_word2.this, "wrong", Toast.LENGTH_SHORT).show();
            isReset = false;
        }
    } else {
        isReset = true;
    }
}

您还可以创建一个死区&#34;通过使外if语句中的范围低于最大值。这将确保用户必须在将Toast再次显示之前将设备重置为接近零。