• Android实现摇晃手机的监听


    

    摘自:http://blog.csdn.net/xwren362922604/article/details/8515343

    监听摇晃手机的类:

    /**
     * @author renxinwei
     *
     * @date 2013-1-17 下午09:19:58
     */
    public class SensorManagerHelper implements SensorEventListener {

     // 速度阈值,当摇晃速度达到这值后产生作用
     private static final int SPEED_SHRESHOLD = 5000;
     // 两次检测的时间间隔
     private static final int UPTATE_INTERVAL_TIME = 50;
     // 传感器管理器
     private SensorManager sensorManager;
     // 传感器
     private Sensor sensor;
     // 重力感应监听器
     private OnShakeListener onShakeListener;
     // 上下文对象context
     private Context context;
     // 手机上一个位置时重力感应坐标
     private float lastX;
     private float lastY;
     private float lastZ;
     // 上次检测时间
     private long lastUpdateTime;
     // 构造器
     public SensorManagerHelper(Context context) {
      // 获得监听对象
      this.context = context;
      start();
     }

     // 开始
     public void start() {
      // 获得传感器管理器
      sensorManager = (SensorManager) context
        .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 interface OnShakeListener {
      public void onShake();
     }

     // 设置重力感应监听器
     public void setOnShakeListener(OnShakeListener listener) {
      onShakeListener = listener;
     }

     /*
      * (non-Javadoc)
      * android.hardware.SensorEventListener#onAccuracyChanged(android.hardware
      * .Sensor, int)
      */
     @Override
     public void onAccuracyChanged(Sensor sensor, int accuracy) {
      // TODO Auto-generated method stub
     }

     /*
      * 重力感应器感应获得变化数据
      * android.hardware.SensorEventListener#onSensorChanged(android.hardware
      * .SensorEvent)
      */
     @Override
     public void onSensorChanged(SensorEvent event) {
      // TODO Auto-generated method stub
      // 现在检测时间
      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;
      double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
        * deltaZ)
        / timeInterval * 10000;
      // 达到速度阀值,发出提示
      if (speed >= SPEED_SHRESHOLD)
       onShakeListener.onShake();
     }
    }


    在Activity中使用:

    SensorManagerHelper sensorHelper = new SensorManagerHelper(this);
      sensorHelper.setOnShakeListener(new OnShakeListener() {
       
       @Override
       public void onShake() {
        // TODO Auto-generated method stub
        System.out.println("shake");
        Toast.makeText(MainActivity.this, "你在摇哦", Toast.LENGTH_SHORT).show();
       }
      });



  • 相关阅读:
    BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路
    BZOJ 1708: [Usaco2007 Oct]Money奶牛的硬币
    BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间
    BZOJ 1611: [Usaco2008 Feb]Meteor Shower流星雨
    BZOJ 1610: [Usaco2008 Feb]Line连线游戏
    BZOJ 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
    BZOJ 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
    BZOJ 1606: [Usaco2008 Dec]Hay For Sale 购买干草
    BZOJ 1083: [SCOI2005]繁忙的都市
    STL set的用法
  • 原文地址:https://www.cnblogs.com/jerry1999/p/4175908.html
Copyright © 2020-2023  润新知