2

このコードを見つけました。その機能は、デバイスが十分に強く振られたときに何かを行うことですが、完全には理解していません。誰でも私を助けてください

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();
      }

}

この2行を理解するのを手伝ってください

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;

前もって感謝します。

4

1 に答える 1

11

センサーは、3 つの軸方向に沿った加速度に対して 3 つの値を返します。これらはxyおよびzコード サンプルに配置されます。ばね上の 3 つの質量がすべて互いに直角になっていると想像してください。デバイスを動かすと、スプリングが伸びたり縮んだりし、そのx長さが含まれます。yz

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

これは、加速度の大きさを計算しています。バネの 3 つの質量の代わりに、デバイスが加速されている方向を常に正確に指す 1 つだけがある場合を想像してみてください。実際には、そのシステムがどのように見えるかを、私たちが持っている値から計算することができます。ここで行われているmAccelCurrentのは、そのようなスプリングがどれだけ伸びるかです。これが実行中の計算です。

mAccel = mAccel * 0.9f + delta;

これは、入力のハイパス フィルターです。ここでは、加速度の急激な変化に大きな値を与える効果があります。あなたが投稿したコードだけでは、これが行われている理由は明らかではありません。mAccelデバイスが振動しているときに、各振動の極端な力に対して最終的により敏感にチェックするコードを別の場所に作成することであると推測しています。

于 2012-06-12T11:19:04.630 に答える