2016-07-07 4 views
3

Я пытаюсь обнаружить правильные тряски телефона, это ниже кода, но его не правильно работать, например, часто, когда я трясти телефон налево я получить RIGHT или получить оба RIGHT и LEFT:Android обнаружить правильный телефон трясти

@Override 
    public void onSensorChanged(int sensor, float[] values) { 
     if (sensor == SensorManager.SENSOR_ACCELEROMETER) { 
      long curTime = System.currentTimeMillis(); 
      // only allow one update every 100ms. 
      if ((curTime - lastUpdate) > 200) { 
       long diffTime = (curTime - lastUpdate); 
       lastUpdate = curTime; 

       x = values[SensorManager.DATA_X]; 
       y = values[SensorManager.DATA_Y]; 
       z = values[SensorManager.DATA_Z]; 

       if (Round(x, 4) > 10.0000) { 
        Toast.makeText(this, "Right shake detected", Toast.LENGTH_SHORT).show(); 
       } else if (Round(x, 4) < -10.0000) { 
        Toast.makeText(this, "Left shake detected", Toast.LENGTH_SHORT).show(); 
       } 

       last_x = x; 
       last_y = y; 
       last_z = z; 
      } 
     } 
    } 

POST ОБНОВЛЕНО:

if (Utils.Round(x, 4) > 8.0000) { 
    //left 
} else if (Utils.Round(x, 4) < -8.0000) { 
    //right 
} else if (z > 9 && z < 10) 
    //down 
else if (z > -10 && z < -9) 
    //up 

ответ

2

Подумайте о том, как работает акселерометр. Он обнаруживает ускорение. Когда вы переместите телефон вправо, вы получите ускорение вправо, а затем 0, когда будете двигаться с постоянной скоростью. Когда ваша ручка останавливается, вы будете видеть отрицательное ускорение (ускорение влево) при замедлении, когда ускорение снова наступает 0 при остановке.

Другими словами, вы всегда увидите положительные/отрицательные пары для каждого движения. когда вы видите оба, это потому, что каждый из них достаточно силен, чтобы запускать фильтр. Когда вы видите неправильный, это означает, что ускорение было слишком медленным, чтобы вызвать его, но замедление было достаточно быстрым. Вы недостаточно разбираетесь в разговоре - для того, чтобы ваше замедление не обнаруживало замедление, это должно было быть движение вправо, которое начинается и заканчивается на 200 мс. Не достаточно долго. Вы должны заглянуть в алгоритмы DSP, если хотите действительно хорошие результаты, но все эти концепции - это небольшая книга сама по себе.

Также помните, что кольца ускорения. То, как акселерометр работает физически, - это изображение, растянутое весом. он будет перерегулировать медиану, затем отскочить назад и сделать это несколько раз. Интерференция этой волны с более поздними данными может привести к нечетным результатам. Возможно, даже сильное кольцо может отключить ваш фильтр несколько раз.

О, также вы НЕ должны использовать currentTimeMillis здесь. В событии датчика есть поле времени. Именно тогда произошло событие. Может быть несколько сотен миллисекунд до того, как событие будет обработано, если система занята. Используйте время в поле события, а не время, в которое вы его обрабатываете. Фиксация, которая может немного помочь, хотя и оставляет другие проблемы.

+0

ОК, позвольте мне изменить свой код и проверить, что –

+0

Мне очень жаль, сэр. после того, как все больше и больше меняют код, я ошибаюсь, не могли бы вы исправить мой код? Я обновил сообщение, спасибо –

Смежные вопросы