2014-11-24 67 views
7

我需要一些非常简单的东西,但我找不到合适的示例来学习。我的唯一的目的是以如下:获取旋转度和度数显示


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

对于其他轴也是如此 - 将手机围绕其长边旋转。


我试着组装来自不同实例的应用程序,使用陀螺仪或加速或旋转矢量传感器,但迟迟不来的东西正常工作。

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

回答

13

网上有几个例子和教程,但要小心。 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)回调来计算方位角,俯仰,滚转设备的价值。请记住,“上面的所有三个角度都是弧度,逆时针方向是正值”。您可以简单地将它们转换为度数Math.toDegrees()

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

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

示例代码阅读更多关于remapCoordinateSystem也关于getRotationMatrixgetOrientationhttp://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

+0

嗨乔鲍,我也跟着你的例子,它给了非常可靠的价值,但我希望得到这些顺时针方向的正值是可能的?我需要对现有代码进行哪些更改? – 2015-12-23 18:55:48

+0

@ParagKadam我猜你只需要从360减去逆时针度,你会得到顺时针程度是这样的: '浮动顺时针= 360 - 逆时针;' 因此,如果逆时针值为15,顺时针则值为345. – 2015-12-27 20:44:08

+0

是的......非常感谢:) – 2015-12-28 09:48:34

0

在文件夹res/values-landres/values-port使用以下内容创建文件layouts.xml

RES/values-land/layouts.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_landscape">true</bool> 
</resources> 

res/values-port/layouts。XML:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_landscape">false</bool> 
</resources> 

在你的源代码,您现在可以访问当前方向如下:

context.getResources().getBoolean(R.bool.is_landscape)