X、Y、Zの意味がちょーっとずつ理解出来てきたかも
と思っているうちはわかっていない(´・ω・`)
加速度センサーと地磁気センサーで方位角や傾きがわかるらしい
参考にしたもの
Xamarin.Android 方位の取得2(磁気センサー/加速度センサー) - SIN@SAPPOROWORKSの覚書
磁気/加速度センサーで方位角/傾きを検出する - Androidプログラマへの道 〜 Moonlight 明日香 〜
実装
MainActivity
package jp.mshige1979.app.samplesensor03; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends Activity { // センサーマネージャー private SensorManager manager; // センサーイベントリスナー private SensorEventListener listener; // 加速度の値 private float[] fAccell = null; // 地磁気の値 private float[] fMagnetic = null; private static final int MATRIX_SIZE = 16; float[] inR = new float[MATRIX_SIZE]; float[] outR = new float[MATRIX_SIZE]; float[] I = new float[MATRIX_SIZE]; // TextView textView1 = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // センサーマネージャーを取得 manager = (SensorManager)getSystemService(SENSOR_SERVICE); // センサーのイベントリスナーを登録 listener = new SensorEventListener() { // 値変更時 @Override public void onSensorChanged(SensorEvent sensorEvent) { // センサーの種類で値を取得 switch( sensorEvent.sensor.getType()) { // 加速度 case Sensor.TYPE_ACCELEROMETER: fAccell = sensorEvent.values.clone(); break; // 地磁気 case Sensor.TYPE_MAGNETIC_FIELD: fMagnetic = sensorEvent.values.clone(); break; } // 両方確保した時点でチェック if(fAccell != null && fMagnetic != null){ // 回転行列を得る SensorManager.getRotationMatrix(inR, I, fAccell, fMagnetic); // ワールド座標とデバイス座標のマッピングを変換する SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Y, outR); // 姿勢を得る float[] fAttitude = new float[3]; SensorManager.getOrientation(outR, fAttitude); for (int i = 0; i < 3; i++) { fAttitude[i] = (float)(fAttitude[i] * 180 / Math.PI); fAttitude[i] = (fAttitude[i] < 0) ? fAttitude[i] + 360 : fAttitude[i]; } // 出力内容を編集 String buf = "---------- Orientation --------\n" + String.format( "方位角\n\t%f\n", fAttitude[0]) + String.format( "前後の傾斜\n\t%f\n", fAttitude[1]) + String.format( "左右の傾斜\n\t%f\n", fAttitude[2]); textView1.setText( buf ); } } // @Override public void onAccuracyChanged(Sensor sensor, int i) { } }; // text textView1 = (TextView)findViewById(R.id.text1); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onResume() { super.onResume(); // リスナー設定:加速度 manager.registerListener ( listener, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST); // リスナー設定:地磁気 manager.registerListener ( listener, manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_FASTEST); } @Override protected void onPause() { super.onPause(); // リスナー解除 manager.unregisterListener(listener); } }
※今回はリスナーオブジェクトを生成して登録
結果
※マイナスが気になったので360で表記しています