2016-07-07 8 views
3

我想這個下面的代碼來檢測正確的電話震動,但它不是我搖動手機留下我得到RIGHT或同時獲得的RIGHTLEFT正確經常工作,例如: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。

換句話說,您將總是會看到每個動作的正/負對。當你看到兩者時,那是因爲它們每個都足夠強大以觸發過濾器。當你看到錯誤的那個時,這意味着加速度太慢而不能觸發它,但是減速度足夠快。你沒有足夠的時間去抖動 - 因爲你的搖晃不能檢測到減速,它必須是在200ms內開始和結束的向右移動。不夠長。如果你想得到非常好的結果,你應該研究DSP算法,但是所有這些概念本身就是一本小書。

還記得加速度響。加速度計工作的方式 - 通過重量拉伸的彈簧。它會超過中位數,然後反彈並多次執行。該波與後期數據的干擾會帶來奇怪的結果。甚至有可能讓一個強大的戒指多次跳過你的過濾器。

哦,你也不應該在這裏使用currentTimeMillis。傳感器事件有時間字段。那是事件真正發生的時間。如果系統繁忙,則可能需要幾百毫秒才能處理事件。在事件字段中使用時間,而不是在處理時間。解決這個問題可能會有所幫助,但它會留下其他問題。

+0

好的,請允許我更改我的代碼並測試 –

+0

我很抱歉,先生。越來越多的更改我的代碼後,我得到錯誤,你能修復我的代碼?我更新後,謝謝 –