Итак, я написал приложение android для игры в кости, с регулируемыми играми в кости (D4-100), суммами и бонусами.
Все отлично работает, когда я нажимаю кнопку прокрутки, но я также хотел, чтобы оно реагировало на встряхивая мой телефон. Проблема в том, что когда я встряхиваю его один раз, он отображает результат, но если я встряхиваю слишком долго, показанные результаты заметно перезаписываются - я не хочу, чтобы пользователь просто продолжал встряхивать, пока результат не будет принят !.
Есть ли какой-нибудь способ собрать все ShakeEvents и вызвать только последнее из них?
Вот что внутри onCreate связано с этими ShakeEvents:
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
ShakeDetector shakeDetector = new ShakeDetector(this);
shakeDetector.start(sensorManager);
и вот Метод "hearShake ()" (из Square, In c. sismi c):
@Override
public void hearShake() {
Toast.makeText(this, "Rolling...", Toast.LENGTH_SHORT).show();
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v.vibrate(VibrationEffect.createOneShot(250,VibrationEffect.DEFAULT_AMPLITUDE));
} else {
v.vibrate(250);
}
rollButton.performClick();
}
Решение :
в rollButton.performClick();
Я добавил long lastShake = System.currentTimeMillis();
Содержимое hearShake()
обернуто внутри if (separateShake())
:
public boolean separateShake(){
return ((System.currentTimeMillis() - lastShake) > 3000) ? true : false;
}
Теперь rollButton.performClick()
срабатывает только при наличии хотя бы 3-секундная задержка между встряхиваниями, что хорошо для меня!