Как мне продолжить хронометр после встряхивания телефона. Хронометр начинает работать, когда я встряхиваю телефон. Но если я встряхну еще раз, хронометр сбрасывается и запускается снова. Я думаю, что у меня есть некоторые проблемы с 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) {
}
};
/* *******************************/
}