我在我的应用程序中安装了摇晃检测器来掷骰子。对于每一次摇动,每个骰子都会滚动一次。问题是当我摇动手机时,它会一次“掷”骰子多次。
我尝试添加一个延迟并更改灵敏度,但是没有一个起作用。
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) {
}
};
最佳答案
我认为您可以尝试通过这种方式获得解决方案。
使用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)
条件下对其进行更新,以便可以在可运行状态中使用它。