检测手机摇晃的监听器

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值