2

左右上下の揺れを検出しようとしています。このコードを調べて見つけました。

public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub

            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

                float[] values = event.values;

                // Movement
                float x = values[0];
                float y = values[1];
                float z = values[2];


                long actualTime = System.currentTimeMillis();
                if ((actualTime - lastUpdate) > 100) 
                {
                    long diffTime = (actualTime - lastUpdate);
                    lastUpdate = actualTime;


                    if(Round(x,4)>8.0000){
                        Log.d("sensor", "=====LEFT====");


                    }
                    else if(Round(x,4)<-8.0000){
                        Log.d("sensor", "=====RIGHT====");

                    }
                    else if(Round(z,4) < -0.0){
                       Log.d("sensor", "=====UP====");


                    }

                    else if(Round(y,4) < 1.0){
                        Log.d("sensor", "=====DOWN====");

                    }

                float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;

                if (speed > SHAKE_THRESHOLD) {
                    //Log.d("sensor", "shake detected w/ speed: " + speed);
                    //Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show();
                }
                last_x = x;
                last_y = y;
                last_z = z;
                }
            }

        }

調べてみたのですが、いくつか疑問があります。
1. 揺れを検知してからの遅延はどこで設定できますか? 最後に検出された揺れの1秒後に揺れを検出したい。
2. 平らな面に置くと、常に下を検出するのはなぜですか。
3. 右ぶれを検出できない

任意のヘルプと提案をいただければ幸いです。

4

1 に答える 1

0

まず、このコードは、揺れではなく動きを検出しているように見えます (揺れは、一方の方向に進み、次に反対方向に戻る動きであると私は理解しています)。

揺れを検知してからの遅延はどこで設定できますか? 最後に検出された揺れの1秒後に揺れを検出したい。

if ((actualTime - lastUpdate) > 100)検出間の間隔が発生する場所です。ここでの 100 は、100 ミリ秒後の変化のみを確認するようにプログラムに指示するため、1 秒が必要な場合は、これを 1000 に変更します。

平らな面に置くと、常に下を検出するのはなぜですか。

明確ではないので、ここでの文脈と方向性については完全にはわかりませんが、あなたが考える「ダウン」は、あなたの空間ではダウンではなく、電話の中でダウンである場合があることを忘れないでください。電話は直立しています。電話が背面にある場合、左と右は同じですが、下 (つまり、地面に向かって) は、実際にはセンサーの背面です。これは、電話の背面に向かっているためです。

  1. 正しい動きのブレを検出できない

TBH 理由はわかりませんが、ここのコードは問題ないようです。電話の問題かもしれませんし、実装の問題かもしれません (先ほど言ったように、上記のコードは全体的な動きであり、返される「シェイク」ではないため、これがトリガーされていないことをテストするために正しく振る方法である可能性があります。しかし、あなたの左の揺れがそれを引き起こしています

于 2013-01-18T14:10:22.253 に答える