Shake Listener检测方向变化

时间:2011-02-08 13:49:17

标签: android orientation shake

我正在尝试检测应用程序中的摇动事件,以便在用户摇动设备时能够执行某些操作。但问题是;我使用的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];
    }

}
}

我想只检测摇动,而不是方向变化。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您可能必须取消注册传感器侦听器,然后对用于确定“摇动事件”的值进行归零/归零/重新初始化。然后重新注册你的听众。

定向更改触发onDestroy后跟onCreate