获得旋转并以度数显示

Mil*_*iez 8 android rotation accelerometer motion-detection gyroscope

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


由于设备在桌面上平放(背面),因此X轴和Y轴应显示0(或接近0).当我从顶部(扬声器所在的位置)和底部(麦克风所在位置)放下时,它应该向我显示手机倾斜了多少度.数学描述 - 以度为单位显示手机背面与桌子之间的角度,其中一个轴.当我抬起底部(并且顶部保持放下)然后显示负度.

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


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

有人能给我一个onSensorChanged功能的例子(正如这里所有的工作一样),并告诉我使用了哪个传感器,所以我知道要注册什么?

Csa*_*zki 14

网上有一些示例和教程,但要小心.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);
          azimuth = orientation[0]; // orientation contains: azimuth, pitch and roll
          pitch = orientation[1];
          roll = orientation[2];
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是你应该如何计算onSensorChanged(SensorEvent event)回调中设备的方位角,俯仰,滚动值.请记住,"上面的所有三个角都是弧度,逆时针方向是正的".你可以简单地将它们转换为度数Math.toDegrees()

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

根据设备的旋转方式,您可能需要重新映射坐标以获得所需的结果.您可以在Android文档中阅读更多关于remapCoordinateSystem和关于getRotationMatrix和更多内容getOrientation

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

  • 在性能的角度来看,在频繁调用的方法中创建一个新对象(`new float []`)是邪恶的.您应该将这些本地数组移动到成员 (2认同)