Я следующий код, который отлично работает на моем Nexus 5.Android - Как обнаружить изменения в компас степени (Java)
public void onSensorChanged(SensorEvent event) {
float degree = Math.round(event.values[0]);
displayMsg.setText(String.valueOf(degree));
}
degree
содержит направление компаса в. Я хочу сделать это, чтобы обнаружить изменения в направлении. Итак, скажем, если человек идет на север, а затем на 10 градусов вправо. Как только человек меняет направление, я хочу заметить. Кроме того, существуют неопределенности. Так, например, когда человек идет на север, направление не является постоянным 0 градусов. Он будет колебаться между 358 и 2-3 градусами.
Я думал использовать Timer.schedule
для хранения градусов каждые 500 мс, а затем сделать
if(Math.abs(degree - storedDegree) > 10)
Toast.makeText(this,"Direction Changed",Toast.LENGTH_SHORT).show();
Однако этот метод работает из памяти из-за количества потоков, созданных я думаю. Есть ли более умный/лучший способ обнаружения изменений в направлении?
UPDATE
Вот полный код, который я делаю.
Я подсчитываю шаги, и я хочу сохранить направление, в котором выполняются шаги. Как только направление изменяется, скажем, на 10 градусов, счетчик шагов должен сохранить значение, которое он имеет (скажем, в списке массивов), а затем перейти к 0 и перезапустить подсчет.
boolean start = true;
@Override
public void onSensorChanged(SensorEvent event) {
//------------------------------Compass--------------------------------------
final float degree = Math.round(event.values[0]);
displayMsg.setText(String.valueOf(degree));
//---------------------------------------------------------------------------
Sensor sensor = event.sensor;
float[] values = event.values;
int value = -1;
int steps;
if (values.length > 0) {
value = (int) values[0];
}
if(mode.equals("Start"))
{
if (sensor.getType() == Sensor.TYPE_STEP_COUNTER)
{
if(start)
{
count = value;
start = false;
}
steps = value-count;
stepCounter.setText("Step Counter Detected : " + steps);
}
}
}
Что не так с тем, что у вас есть?Кажется, что onSensorChanged следует вызывать, когда когда-либо человек меняет направление, а затем вы просто сравниваете текущую степень с сохраненным значением (как вы показали) – nPn
'onSensorChanged' не получает вызов сверхурочно, когда человек меняет направление. он постоянно называется всегда. Проблема с тем, что я предложил, заключается в том, что я использую 'Timer timer = new Timer();' then 'timer.schedule (timerTask, 5000)' method. но у этого метода заканчивается память! – Masster