2011-02-08 40 views
0

我試圖在我的應用程序中檢測搖動事件,以便在用戶搖動設備時能夠執行某些操作。但問題是,我使用的ShakeListener檢測到方向變化是一種搖動事件(當我將手機從風景變爲人像時,它會檢測到搖晃)搖動監聽器檢測到方向更改

我嘗試更改力閾值,但當時它無法檢測到任何震動事件。

這裏是ShakeListener代碼這是我從this site了:

import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 

public class ShakeListener implements SensorEventListener { 
private static final int FORCE_THRESHOLD = 500; 
private static final int TIME_THRESHOLD = 100; 
private static final int SHAKE_TIMEOUT = 500; 
private static final int SHAKE_DURATION = 1000; 
private static final int SHAKE_COUNT = 3; 

private SensorManager mSensorMgr; 
private float mLastX = -1.0f, mLastY = -1.0f, mLastZ = -1.0f; 
private long mLastTime; 
private OnShakeListener mShakeListener; 
private Context mContext; 
private int mShakeCount = 0; 
private long mLastShake; 
private long mLastForce; 

public interface OnShakeListener { 
    public void onShake(); 
} 

public ShakeListener(Context context) { 
    mContext = context; 
} 

public void setOnShakeListener(OnShakeListener listener) { 
    mShakeListener = listener; 
} 

public void resume(OnShakeListener listener) { 
    this.setOnShakeListener(listener); 
    mSensorMgr = (SensorManager) mContext 
      .getSystemService(Context.SENSOR_SERVICE); 
    if (mSensorMgr == null) { 
     throw new UnsupportedOperationException("Sensors not supported"); 
    } 

    boolean supported = mSensorMgr.registerListener(this, 
      mSensorMgr.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_UI); 

    if (!supported) { 
     mSensorMgr.unregisterListener(this, 
       mSensorMgr.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER)); 
     throw new UnsupportedOperationException(
       "Accelerometer not supported"); 
    } 
} 

public void pause() { 
    mShakeListener = null; 
    if (mSensorMgr != null) { 
     mSensorMgr.unregisterListener(this, 
       mSensorMgr.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER)); 
     mSensorMgr = null; 
    } 
} 

public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    // TODO Auto-generated method stub 

} 

public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() != SensorManager.SENSOR_ACCELEROMETER) 
     return; 
    long now = System.currentTimeMillis(); 

    if ((now - mLastForce) > SHAKE_TIMEOUT) { 
     mShakeCount = 0; 
    } 

    if ((now - mLastTime) > TIME_THRESHOLD) { 
     long diff = now - mLastTime; 
     float speed = Math.abs(event.values[SensorManager.DATA_X] 
       + event.values[SensorManager.DATA_Y] 
       + event.values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ) 
       /diff * 10000; 
     if (speed > FORCE_THRESHOLD) { 
      if ((++mShakeCount >= SHAKE_COUNT) 
        && (now - mLastShake > SHAKE_DURATION)) { 
       mLastShake = now; 
       mShakeCount = 0; 
       if (mShakeListener != null) { 
        mShakeListener.onShake(); 
       } 
      } 
      mLastForce = now; 
     } 
     mLastTime = now; 
     mLastX = event.values[SensorManager.DATA_X]; 
     mLastY = event.values[SensorManager.DATA_Y]; 
     mLastZ = event.values[SensorManager.DATA_Z]; 
    } 

} 
} 

我想只檢測震動的運動,沒有方向的變化。

有什麼建議嗎?

回答

0

您可能需要取消註冊傳感器偵聽器,然後清零/清零/重新初始化用於確定「抖動事件」的值。然後重新註冊您的聽衆。

行爲更改觸發onDestroy後跟onCreate