网上有几个例子和教程,但要小心。 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