2 回答
TA贡献1906条经验 获得超10个赞
我认为您可以尝试通过这种方式获得解决方案。
使用 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),以便可以在可运行的环境中使用。
TA贡献1848条经验 获得超10个赞
通过添加一个布尔值“rolled”,并在掷骰子时将其设置为真,您只能掷一次骰子。您可以通过将值设置回 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) {
}
};
添加回答
举报