android – 如何在摇动设备时刷新应用程序?

我需要添加一个可以刷新我的Android应用程序的摇动功能.

我发现的所有文档都涉及实现SensorListener,但Eclipse告诉我它已被弃用并建议使用SensorEventListener.

谁有一个很好的指导我如何创建这个摇动控制器?

解决方法:

这是一个示例代码.
把它放到你的活动类中:

  /* put this into your activity class */
  private SensorManager mSensorManager;
  private float mAccel; // acceleration apart from gravity
  private float mAccelCurrent; // current acceleration including gravity
  private float mAccelLast; // last acceleration including gravity

  private final SensorEventListener mSensorListener = new SensorEventListener() {

    public void onSensorChanged(SensorEvent se) {
      float x = se.values[0];
      float y = se.values[1];
      float z = se.values[2];
      mAccelLast = mAccelCurrent;
      mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
      float delta = mAccelCurrent - mAccelLast;
      mAccel = mAccel * 0.9f + delta; // perform low-cut filter
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
  };

  @Override
  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {
    mSensorManager.unregisterListener(mSensorListener);
    super.onPause();
  }

并将其添加到您的onCreate方法:

    /* do this in onCreate */
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    mAccel = 0.00f;
    mAccelCurrent = SensorManager.GRAVITY_EARTH;
    mAccelLast = SensorManager.GRAVITY_EARTH;

然后,您可以在应用程序中的任何位置询问“mAccel”当前加速度,独立于轴并清除静态加速度(如重力).
它将是约.如果没有移动,则为0;如果设备被抖动,则设为> 2.

根据评论 – 测试这个:

if (mAccel > 12) {
    Toast toast = Toast.makeText(getApplicationContext(), "Device has shaken.", Toast.LENGTH_LONG);
    toast.show();
}

笔记:

应该在onPause上停用accelometer并在onResume上激活以节省资源(CPU,电池).
代码假定我们在地球上;-)并初始化加速到地球引力.否则,当应用程序启动时,您将获得强烈的“震动”,并从*落体中“击中”地面.然而,由于低截止滤波器,代码习惯于引力,并且一旦初始化,它也可以在其他行星或*空间中工作.
(你永远不知道你的应用程序将被使用多久……

上一篇:SpringCloud + RabbitMQ一个消费者配置多生产者以及重试机制(没电脑未完成)


下一篇:java-如何以编程方式更改Animation实例的“ x-delta”?