获取旋转和度数显示

我需要一些非常简单的东西,但我找不到一个合适的例子来学习。 我唯一的目的是以下几点:


由于设备平放在桌面上,因此X轴和Y轴应显示0(或接近0)。 当我从顶部(扬声器所在的位置)和底部(麦克风所在的位置)放下扬声器时,应该会显示手机倾斜了多less度数。 在math上描述 – 以度数表示手机背面和桌子之间的angular度,对于其中一个轴。 当我抬起底部(顶部保持放下),然后显示负度。

另一个轴也是如此 – 将手机围绕其长边旋转


我尝试使用陀螺仪加速度计或旋转vector传感器组装来自不同示例的应用程序,但无法正常工作。

有人可以给我一个onSensorChanged函数的例子(所有的工作在这里进行),只是告诉我哪个传感器被使用,所以我知道要注册什么?

Solutions Collecting From Web of "获取旋转和度数显示"

网上有几个例子和教程,但要小心。 Sensor.TYPE_ORIENTATION已被弃用。 您需要通过侦听这两个传感器Sensor.TYPE_ACCELEROMETERSensor.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)callback中设备的方位angular,俯仰angular和滚onSensorChanged(SensorEvent event)值。 请记住,“上面的所有三个angular度都是弧度,逆时针方向为正值”。 你可以简单地将它们转换成Math.toDegrees()

正如Louis CAD在评论中指出的那样,将I,R和方向数组的初始化移出onSensorChangedcallback是一个好主意,因为它被频繁调用。 创build并将它们留在GC后面对您的应用程序性能不利。 为了简单起见,我把它留在那里。

根据您的设备旋转的方式,您可能需要重新映射坐标才能得到您想要的结果。 你可以阅读更多关于remapCoordinateSystem和关于getRotationMatrixgetOrientation的android文档

示例代码: http : //www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html