“摇动做某事”代码解释

时间:2012-06-12 10:54:07

标签: android acceleration

我已经找到了这个代码,它的功能是当设备动摇得足够强时做一些事情,但我还没有完全理解它。有人请帮助我

public class ShakeActivity extends Activity {
    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        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;
    }
      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 onStop() {
        mSensorManager.unregisterListener(mSensorListener);
        super.onStop();
      }

}

请帮助我理解这两行

mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));//I guess this is for computing the value of the acceleration

这行我不明白

 mAccel = mAccel * 0.9f + delta;

提前感谢。

1 个答案:

答案 0 :(得分:9)

传感器将返回三个值,用于沿三个轴方向的加速度;这些文件放在代码示例中的xyz中。想象一下,弹簧上的三个质量块彼此成直角;当您移动设备并且弹簧伸展和收缩时,xyz包含它们的长度。

mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));

这是计算加速度的大小。想象一下,如果弹簧上的三个质量,你只有一个,总是指向设备加速的方向。实际上可以从我们拥有的值中找出那个系统的样子,那是什么的在这里完成:mAccelCurrent是这样一个春天会被拉伸多少。 This是正在执行的计算。

mAccel = mAccel * 0.9f + delta;

这是输入中的high pass filter。在这里它具有使加速度的突然变化给出更大值的效果。仅仅从您发布的代码中就不清楚为什么要这样做;我猜这是在其他地方制作代码,最终检查mAccel对设备震动时每次震动的极端力量更敏感。