获得旋转并以度数显示

时间:2014-11-24 13:59:37

标签: android rotation accelerometer gyroscope motion-detection

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


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

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


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

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

2 个答案:

答案 0 :(得分: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];
       }
    }
}

这是您应该如何计算onSensorChanged(SensorEvent event)回调中设备的方位角,俯仰,滚动值。请记住,“上面的所有三个角都是弧度,逆时针方向是正的”。您只需使用Math.toDegrees()

将它们转换为度数即可

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

根据设备的旋转方式,您可能需要重新映射坐标才能获得所需的结果。您可以在android documentation

中详细了解remapCoordinateSystem以及getRotationMatrixgetOrientation

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

答案 1 :(得分:0)

看看这个简单的 CameraLevel 应用程序。 https://github.com/konstantinvoronov/camerahorizon_overlay

camerahorizo​​n_overlay 不使用磁场和加速度计传感器,而只使用加速度计并且运行良好。