/**
* ShakeDetector.java
*
* @author chengsiyu
*
* @date 2011-3-28
*
* Copyright 2011 netease. All rights reserved.
*/
package com.hellodev.lightme.util;
import java.util.ArrayList;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
/**
* @author chengsiyu
*
*/
public class ShakeDetector implements SensorEventListener
{
private Context context;
private SensorManager sensorManager;
private ArrayList<OnShakeListener> listeners;
private Long lastTime = null;
private float lastX, lastY, lastZ;
private long lastTrigger = 0;
private static final int TIME_SHRESHOLD = 100;
private static final double SHAKE_SHRESHOLD = 100;
public ShakeDetector(Context context)
{
this.context = context;
sensorManager = (SensorManager)this.context.getSystemService(Context.SENSOR_SERVICE);
listeners = new ArrayList<OnShakeListener>();
lastTime = null;
}
public void start()
{
if(sensorManager != null)
{
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if(sensor != null)
{
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
}
}
}
public void stop()
{
if(sensorManager != null)
{
sensorManager.unregisterListener(this);
}
}
public void registerOnShakeListener(OnShakeListener listener)
{
if(listener == null || listeners.contains(listener))
{
return;
}
listeners.add(listener);
}
public void removeOnShakeListener(OnShakeListener listener)
{
if(listener == null)
{
return;
}
listeners.remove(listener);
}
/* (non-Javadoc)
* @see android.hardware.SensorEventListener#onAccuracyChanged(android.hardware.Sensor, int)
*/
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
/* (non-Javadoc)
* @see android.hardware.SensorEventListener#onSensorChanged(android.hardware.SensorEvent)
*/
public void onSensorChanged(SensorEvent event)
{
if(lastTime == null)
{
lastTime = System.currentTimeMillis();
return;
}
Long currentTime = System.currentTimeMillis();
long diffTime = currentTime - lastTime;
if (diffTime < TIME_SHRESHOLD)
{
return;
}
lastTime = currentTime;
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
float deltaX = x - lastX;
float deltaY = y - lastY;
float deltaZ = z - lastZ;
lastX = x;
lastY = y;
lastZ = z;
double delta = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ* deltaZ) * 1000/ diffTime;
if (delta > SHAKE_SHRESHOLD)
{
this.notifyListeners();
}
}
private void notifyListeners()
{
long curTime = System.currentTimeMillis();
if(curTime - lastTrigger < 1000) // less than 1 second
{
return;
}
lastTrigger = curTime;
for (OnShakeListener listener : listeners)
{
listener.onShake();
}
}
public interface OnShakeListener
{
public void onShake();
}
}