检测手机摇晃的监听器

来源:互联网 发布:网络是把双刃剑怎么画 编辑:程序博客网 时间:2024/04/29 06:31
public class ShakeListener implements SensorEventListener {   // 速度阈值,当摇晃速度达到这值后产生作用   private static final int SPEED_SHRESHOLD = 3000;   // 两次检测的时间间隔   private static final int UPTATE_INTERVAL_TIME = 70;   // 传感器管理器   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;      // 现在的时间变成last时间      lastUpdateTime = currentUpdateTime;      // 获得x,y,z坐标      float x = event.values[0];      float y = event.values[1];      float z = event.values[2];      // 获得x,y,z的变化值      float deltaX = x - lastX;      float deltaY = y - lastY;      float deltaZ = z - lastZ;      // 将现在的坐标变成last坐标      lastX = x;      lastY = y;      lastZ = z;      //sqrt 返回最近的双近似的平方根      double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ            * deltaZ)/ timeInterval * 10000;//    MyLog.v("thelog", "===========log===================");      // 达到速度阀值,发出提示      if (speed >= SPEED_SHRESHOLD) {         onShakeListener.onShake();      }   }   public void onAccuracyChanged(Sensor sensor, int accuracy) {}// 摇晃监听接口public interface OnShakeListener {   public void onShake();}}
0 0
原创粉丝点击