我在自己的应用中实现了摇晃检测器来掷骰子。对于每一次摇动,每个骰子都会滚动一次。问题是当我摇动手机时,它会一次“掷”骰子多次。
我尝试添加一个延迟并更改灵敏度,但是没有一个起作用。
private final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
float z = sensorEvent.values[2];
acelLast = acelVal;
acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = acelVal - acelLast;
shake = shake * 0.9f + delta;
if (shake > 12) {
// roll dice
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
答案 0 :(得分:1)
我认为您可以尝试通过这种方式获得解决方案。
使用Handler会增加时间延迟,并且对于多个senson响应,它将仅对最后满足的条件采取措施,并且从回调中删除一次被调用的previoulsy。
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
public void run() {
// roll dice
}
};
private final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
float z = sensorEvent.values[2];
acelLast = acelVal;
acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = acelVal - acelLast;
shake = shake * 0.9f + delta;
if (shake > 12) {
try {
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 1000);
} catch(Exception e) {
e.printStackTrace();
}
}
}
@override
public void onStop() {
super.onStop();
handler.removeCallbacks(runnable);
}
如果需要传感器提供任何内容,则可以删除类变量,并在条件if (shake > 12)
下对其进行更新,以便可以在可运行状态中使用它。
答案 1 :(得分:0)
通过添加一个布尔值“ rolled”,并在掷骰子时将其设置为true,则只能掷骰子一次。然后,您可以通过将该值重新设置为false来再次滚动。
private static boolean rolled = false;
private final SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
float z = sensorEvent.values[2];
acelLast = acelVal;
acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = acelVal - acelLast;
shake = shake * 0.9f + delta;
if (shake > 12 && !rolled) {
// roll dice
rolled = true;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};