網上有幾個例子和教程,但要小心。 Sensor.TYPE_ORIENTATION
已被棄用。您需要通過偵聽這兩個傳感器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);
azimut = orientation[0]; // orientation contains: azimut, pitch and roll
pitch = orientation[1];
roll = orientation[2];
}
}
}
這是你應該如何在onSensorChanged(SensorEvent event)
回調來計算方位角,俯仰,滾轉設備的價值。請記住,「上面的所有三個角度都是弧度,逆時針方向是正值」。您可以簡單地將它們轉換爲度數Math.toDegrees()
正如Louis CAD在評論中指出的那樣,將I,R和方向陣列的初始化從onSensorChanged回調中移出是一個好主意,因爲它經常被調用。創建GC並將它們留在GC後面對您的應用程序性能不利。爲了簡單起見,我將它留在那裏。
根據您的設備旋轉的方式,您可能需要重新映射座標才能得到您想要的結果。您可以在android documentation
示例代碼閱讀更多關於remapCoordinateSystem
也關於getRotationMatrix
和getOrientation
: http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html
嗨喬鮑,我也跟着你的例子,它給了非常可靠的價值,但我希望得到這些順時針方向的正值是可能的?我需要對現有代碼進行哪些更改? – 2015-12-23 18:55:48
@ParagKadam我猜你只需要從360減去逆時針度,你會得到順時針程度是這樣的: '浮動順時針= 360 - 逆時針;' 因此,如果逆時針值爲15,順時針則值爲345. – 2015-12-27 20:44:08
是的......非常感謝:) – 2015-12-28 09:48:34