Решено - Java ShakeDetector запускается несколько раз - Как получить последний вывод? - PullRequest
1 голос
/ 15 января 2020

Итак, я написал приложение 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-секундная задержка между встряхиваниями, что хорошо для меня!

1 Ответ

0 голосов
/ 16 января 2020

Одним из решений может быть запись времени, в которое записывается сотрясение, и игнорирование любых дополнительных сотрясений, которые происходят, например, в течение следующих 3 секунд. Таким образом, они должны были бы сделать довольно длинный встряхиватель, чтобы он считался кратным.

...