package net.oschina.gitapp.util; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * 摇一摇监听事件 * @created 2014-08-19 * @author 火蚁(http://my.oschina.net/LittleDY) * */ public class ShakeListener implements SensorEventListener { private static final int SPEED_SHRESHOLD = 4500;//这个值越大需要越大的力气来摇晃手机 private static final int UPTATE_INTERVAL_TIME = 50; private SensorManager sensorManager; private Sensor sensor; private OnShakeListener onShakeListener; private Context mContext; private float lastX; private float lastY; private float lastZ; private long lastUpdateTime; public ShakeListener(Context c) { mContext = c; start(); } public void start() { sensorManager = (SensorManager) mContext .getSystemService(Context.SENSOR_SERVICE); if (sensorManager != null) { sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } if (sensor != null) { sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME); } } public void stop() { sensorManager.unregisterListener(this); } public void setOnShakeListener(OnShakeListener listener) { onShakeListener = listener; } public void onSensorChanged(SensorEvent event) { long currentUpdateTime = System.currentTimeMillis(); long timeInterval = currentUpdateTime - lastUpdateTime; if (timeInterval < UPTATE_INTERVAL_TIME) return; lastUpdateTime = currentUpdateTime; 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 speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / timeInterval * 10000; if (speed >= SPEED_SHRESHOLD) { onShakeListener.onShake(); } } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public interface OnShakeListener { public void onShake(); } }