web-dev-qa-db-ja.com

回転を取得し、度で表示します

非常に単純なものが必要ですが、学ぶのに適した例を見つけることができませんでした。私の唯一の目的は次のとおりです。


デバイスが机の上に平らに(背面に)置かれているので、X軸とY軸に0(または0に近い)が表示されます。上部(スピーカーがある場所)から持ち上げて、下部(マイクがある場所)を下に置いたままにすると、電話が何度傾いているかがわかります。数学的に説明-軸の1つについて、電話の背面とテーブルの間の角度を度で表示します。下の部分を持ち上げると(そして上の部分は下に置かれたままです)、マイナス度を表示します。

同じことが他の軸にも当てはまります-電話をその長辺の周りで回転させます。


ジャイロスコープ、加速度計、または回転ベクトルセンサーを使用して、さまざまな例のアプリを組み立ててみましたが、正常に動作するものが付属していませんでした。

誰かがonSensorChanged関数の例を教えてくれ(すべての作業はここで行われているので)、使用されているセンサーを教えてくれるので、何を登録すればよいかわかりますか?

8
Milkncookiez

Webにはいくつかの例とチュートリアルがありますが、注意してください。 _Sensor.TYPE_ORIENTATION_は非推奨になりました。これらの2つのセンサー_Sensor.TYPE_ACCELEROMETER_と_Sensor.TYPE_MAGNETIC_FIELD_を聞いて、回転を計算する必要があります。

これらのセンサーからの通知を受信するために登録した後のトリッキーな部分は、センサーから受信したデータを処理する方法を理解することです。重要な部分は次のとおりです。

_public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
       mGravity = event.values;

    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
       mGeomagnetic = event.values;

    if (mGravity != null && mGeomagnetic != null) {
       float R[] = new float[9];
       float I[] = new float[9];

       boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
       if (success) {
          float orientation[] = new float[3];
          SensorManager.getOrientation(R, orientation);
          azimuth = orientation[0]; // orientation contains: azimuth, pitch and roll
          pitch = orientation[1];
          roll = orientation[2];
       }
    }
}
_

これは、onSensorChanged(SensorEvent event)コールバックでデバイスの方位角、ピッチ、ロール値を計算する方法です。 「上記の3つの角度はすべてラジアンであり、反時計回りに正である」ことに注意してください。 Math.toDegrees()で簡単に度に変換できます

Louis CADがコメントで指摘しているように、I、R、および方向配列の初期化は頻繁に呼び出されるため、onSensorChangedコールバックから移動することをお勧めします。作成してからGCのためにそれらを残すことは、アプリのパフォーマンスに悪影響を及ぼします。簡単にするために、そのままにしておきました。

デバイスの回転方法に基づいて、必要な結果を得るために座標を再マップする必要がある場合があります。 AndroidドキュメントremapCoordinateSystemについて、またgetRotationMatrixgetOrientationについて詳しく読むことができます。

コード例: http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

14