[java] view plaincopy
/**
* 摇动检测器
*
@author Nono
*
*/
public class ShakeDetector implements SensorEventListener{
private static final String TAG = ShakeDetector.class.getSimpleName();
private static final double SHAKE_SHRESHOLD = 7000d;
private Context mContext;
private long lastTime ;
private float last_x;
private float last_y;
private float last_z;
private SensorManager sensorManager;
private onShakeListener shakeListener;
/**
* 构造
*
@param context
*/
public ShakeDetector(Context context){
mContext = context;
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
}
/**
* 注册传感器
*/
public boolean registerListener() {
if (sensorManager != null) {
Sensor sensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if (sensor != null) {
this.sensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_GAME);
LogUtil.log(TAG, "registerListener: succeed!!");
return true;
}
}
return false;
}
/**
* 反注册传感器
*/
public void unRegisterListener() {
if (sensorManager != null)
sensorManager.unregisterListener(this);
}
public void setOnShakeListener(onShakeListener listener){
shakeListener = listener;
}
public void onSensorChanged(SensorEvent event) {
//if (event.sensor.getType() == SensorManager.SENSOR_ACCELEROMETER) {
long curTime = java.lang.System.currentTimeMillis();
if ((curTime - lastTime) > 10) {
long diffTime = (curTime - lastTime);
lastTime = curTime;
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
float speed = Math.abs(x + y + z - last_x - last_y - last_z)
/ diffTime * 10000;
if (speed > SHAKE_SHRESHOLD) {
// 检测到摇晃后执行的代码
shakeListener.onShake();
}
last_x = x;
last_y = y;
last_z = z;
}
//}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
/**
*
*
@author Nono
*
*/
public interface onShakeListener{
public void onShake();
}
}
上面是自己实现的一个关于加速度的传感器类
在Activity中实例化该类,并实现onShakeListener接口
[java] view plaincopy
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
super.onCreate(savedInstanceState);
mContext = this;
mShakeDetector = new ShakeDetector(mContext);
mShakeDetector.setOnShakeListener(this);
然后你可以在Activity的几个生命周期中实现它的注册和反注册。
在onshakeListener中onShake方法中做传感器检测到变动的事件处理。