获取旋转度和度数显示
我需要一些非常简单的东西,但我找不到合适的示例来学习。我的唯一的目的是以如下:获取旋转度和度数显示
当装置被置于平的(在它的后面)在桌子上,它应该为X和Y轴显示0(或接近于0)。当我从顶部(扬声器所在的位置)和底部(麦克风所在的位置)将其抬起时,它应该显示手机倾斜了多少度数。在数学上描述 - 以度数表示手机背面和桌子之间的角度,对于其中一个轴。当我抬起底部(顶部保持放下),然后显示负度。
对于其他轴也是如此 - 将手机围绕其长边旋转。
我试着组装来自不同实例的应用程序,使用陀螺仪或加速或旋转矢量传感器,但迟迟不来的东西正常工作。
有人可以给我一个onSensorChanged
函数的例子(因为所有的工作都在这里进行),并告诉我使用了哪个传感器,所以我知道要注册什么?
网上有几个例子和教程,但要小心。 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
在文件夹res/values-land
和res/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)
嗨乔鲍,我也跟着你的例子,它给了非常可靠的价值,但我希望得到这些顺时针方向的正值是可能的?我需要对现有代码进行哪些更改? – 2015-12-23 18:55:48
@ParagKadam我猜你只需要从360减去逆时针度,你会得到顺时针程度是这样的: '浮动顺时针= 360 - 逆时针;' 因此,如果逆时针值为15,顺时针则值为345. – 2015-12-27 20:44:08
是的......非常感谢:) – 2015-12-28 09:48:34