ベルフェゴール:
私はオンラインの答えの多くを見ると、それらはすべて同様のコピー貼り付けコードを持っていますが、どれが本当に彼らが使用することを数学の説明を持っていません。私はstackoverflowの上で見るの回答と同じですtutorialspoint上のコードへのURLを持っています。しかし、誰かが私には、コードのこの部分を説明することができます。
private final SensorEventListener mSensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
float delta = mAccelCurrent - mAccelLast;
// What is this doing?
mAccel = mAccel * 0.9f + delta;
if (mAccel > 12) {
Toast.makeText(getApplicationContext(), "Shake event detected", Toast.LENGTH_SHORT).show();
}
}
この行はやって何を想定しています
mAccel = mAccel * 0.9f + delta;
0.9fはどこから来たのと、なぜ我々は自分自身を掛けるとデルタを追加していますか?それは私には明らかではありませんので、私の物理学は強力ではありません。
https://www.tutorialspoint.com/how-to-detect-shake-event-in-android-app
lgsp:
私はまた、あなたがリンクされtutorialspointページに、コードを見ていました。私は、アルゴリズムにおける3つのステップを参照してください。
mAccelCurrent
加速度の現在の絶対値として算出されますdelta
加速度の現在と前回の絶対値との差として算出されます。これは、一定の加速度値(重力)と揺れ運動amplfy(加速度の変化)を取り除くために行われます。mAccel
算出される指数平滑法のdelta
0.9係数と、一次フィルタ、すなわち、この関数が呼び出されたタイミングに応じて、(それはしばしば呼ばれる場合、それは低い値'S)高い値又は低い値とすることができます。あなたは正しいことを言っている0.1f
の乗算ルックスが不足していることが、しかし、あなたが保護のコードを見ればvoid onCreate
機能、あなたはそれを見ることができるmAccel
時に初期化されます10f
。言い換えれば、mAccel
の10倍の指数平滑ですdelta
。- 結果は、任意の値として私に見えた、12と比較されます。
あなたが優先する場合は(1.2ではなく12)、比較されますこれにも10倍の値によって減少させるために十分であろう、0.1乗算を使用することができます