摇一摇传感器工具类
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class SensorManagerHelper implements SensorEventListener {
// 传感器管理器
private SensorManager sensorManager;
// 重力感应监听器
private OnShakeListener onShakeListener;
// 上下文对象context
private final Context context;
//检测的时间间隔
static final int UPDATE_INTERVAL = 100;
//上一次检测的时间
long mLastUpdateTime;
//上一次检测时,加速度在x、y、z方向上的分量,用于和当前加速度比较求差。
float mLastX, mLastY, mLastZ;
//摇晃检测阈值,决定了对摇晃的敏感程度,越小越敏感。
public int shakeThreshold = 3333;
//是否出发了摇一摇
private int mShakeNum = 0;
public SensorManagerHelper(Context context) {
this.context = context;
init();
}
/**
* 开始检测
*/
private void init() {
// 获得传感器管理器
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
startListen();
}
//启动监听
public void startListen() {
if (sensorManager != null) {
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if (sensor != null) {
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
}
}
}
/**
* 停止检测
*/
public void stop() {
sensorManager.unregisterListener(this);
}
/**
* 摇晃监听接口
*/
public interface OnShakeListener {
void onShake();
}
/**
* 设置重力感应监听器
*/
public void setOnShakeListener(OnShakeListener listener) {
onShakeListener = listener;
}
@Override
public void onSensorChanged(SensorEvent event) {
long currentTime = System.currentTimeMillis();
long diffTime = currentTime - mLastUpdateTime;
if (diffTime < UPDATE_INTERVAL) {
return;
}
mLastUpdateTime = currentTime;
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
float deltaX = x - mLastX;
float deltaY = y - mLastY;
float deltaZ = z - mLastZ;
mLastX = x;
mLastY = y;
mLastZ = z;
float delta = (float) (Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / diffTime * 10000);
// 当加速度的差值大于指定的阈值,认为这是一个摇晃
if (delta > shakeThreshold) {
mShakeNum++;
if (mShakeNum > 3) {
mShakeNum = 0;
onShakeListener.onShake();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
在基类Activity当中的配置使用
1.在onResume()当中开启监听
private SensorManagerHelper mShakeHelper;
//开启摇一摇监测功能
private void startShakeListen() {
if (mShakeHelper == null) {
mShakeHelper = new SensorManagerHelper(this);
//这里的监听为SensorManagerHelper.OnShakeListener
mShakeHelper.setOnShakeListener(this);
}
mShakeHelper.startListen();
}
2.在onPause()当中取消监听
private SensorManagerHelper mShakeHelper;
//关闭摇一摇监测
private void stopShakeListen() {
if (mShakeHelper != null) {
mShakeHelper.stop();
}
}