2011-02-08 3 views
0

私は自分のアプリケーションで揺れイベントを検出しようとしているため、ユーザーがデバイスを揺すると何かをすることができます。しかし、問題は、私が使用していたShakeListenerは、振る舞いとしてオリエンテーションの変化を検出します(電話機を風景から肖像画に移動すると、揺れが検出されます)シェイクリスナーがオリエンテーションの変化を検出しました

力の閾値を変更しようとしましたが、イベント。ここで

は私がthis siteから取ったShakeListenerコードです:

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がトリガーされます。

関連する問題