Как продолжить хронометр после встряхивания телефона - PullRequest
0 голосов
/ 11 октября 2019

Как мне продолжить хронометр после встряхивания телефона. Хронометр начинает работать, когда я встряхиваю телефон. Но если я встряхну еще раз, хронометр сбрасывается и запускается снова. Я думаю, что у меня есть некоторые проблемы с start() stop() методами в Хронометре, но я, к сожалению, не знаю, как это исправить.

public class MainActivity extends AppCompatActivity {

private static final String TAG = "ShakeBaby";

private Chronometer mChronometer;

private static final int SHAKE_SENSITIVITY = 1;

private TextView startRun, finishRun, calmPosition;

private SensorManager sensorManager;

private float accel = SensorManager.GRAVITY_EARTH;
private float accelPrevious = SensorManager.GRAVITY_EARTH;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mChronometer = findViewById(R.id.mChronometer);

    startRun = findViewById(R.id.startRun);
    finishRun = findViewById(R.id.finishRun);
    calmPosition = findViewById(R.id.calmPosition);

    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    sensorManager.registerListener(
            sensorListener,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_NORMAL);

    mChronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
        @Override
        public void onChronometerTick(Chronometer chronometer) {
            long elapsedMillis = SystemClock.elapsedRealtime()
                    - mChronometer.getBase();

            if (elapsedMillis > 10000) {
                finishRun.setVisibility(View.VISIBLE);
            }
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    sensorManager.registerListener(
            sensorListener,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_GAME);
}

@Override
protected void onStop() {
    sensorManager.unregisterListener(sensorListener);
    mChronometer.stop();
    super.onStop();
}

protected void onShake(){
    Log.d(TAG, "SHAKE");
    startRun.setVisibility(View.VISIBLE);
    mChronometer.setBase(SystemClock.elapsedRealtime());
    mChronometer.start();
}

private final SensorEventListener sensorListener = new SensorEventListener() {

    public void onSensorChanged(SensorEvent sensorEvent) {
        float x = sensorEvent.values[0];
        float y = sensorEvent.values[1];
        float z = sensorEvent.values[2];
        accelPrevious = accel;
        accel = (float) Math.sqrt((double) (x * x + y * y + z * z));
        if (accel - accelPrevious > SHAKE_SENSITIVITY) {
            onShake();
            }
        }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
};
/* *******************************/

}

...