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) {
}
};
添加回答
舉報