我正在努力创建一个类似于&#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.
}
答案 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
再次显示之前将设备重置为接近零。