Мое требование относится как Google maps apps
в режиме компаса (вы можете увидеть демонстрацию при нажатии на current location button twice
):
- В этом режиме
compass
Карты всегда поворачиваются на угол так, чтобыbluedot arrow
всегда указывал на верхний экран.
Но я не знаю, как вычислить правильные значения bearing
из azimuth, pitch, roll
.
public void onSensorChanged(SensorEvent sensorEvent) {
switch (sensorEvent.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
System.arraycopy(sensorEvent.values, 0, mAccelerometers, 0, 3);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
System.arraycopy(sensorEvent.values, 0, mMagnetometers, 0, 3);
break;
default:
break;
}
float[] rotationMatrix = new float[9];
boolean success =
SensorManager.getRotationMatrix(rotationMatrix, null, mAccelerometers, mMagnetometers);
if (success) {
SensorManager.getOrientation(rotationMatrix, mOrientation);
float azimuth = Math.toDegrees(mOrientation[0]);
float pitch = Math.toDegrees(mOrientation[1]);
float roll = Math.toDegrees(mOrientation[2]);
}
// cal to updateBearing();
}
В iOS CLHeading
может возвращать точно true heading
. Есть ли класс с тем же свойством в android
или как его вычислить?