我在两个不同设备(Elocity A7和Archos 7 Home平板电脑)上测试加速度计输出,但传感器似乎给出了不同的结果。我将它编程为设置为横向模式,但x和y轴似乎是两个设备之间的对手。当垂直于地面并且Archos X轴返回0时,x轴返回10.Elocity平板电脑是android 2.2,Archos是2.1。有人可以指出我正确的方向,如何从这两个设备之间的加速度计同步?
答案 0 :(得分:15)
实际上,加速度计轴相对于设备的默认方向。
在这里如何处理它:
static void canonicalOrientationToScreenOrientation(
int displayRotation, float[] canVec, float[] screenVec)
{
final int axisSwap[][] = {
{ 1, -1, 0, 1 }, // ROTATION_0
{-1, -1, 1, 0 }, // ROTATION_90
{-1, 1, 0, 1 }, // ROTATION_180
{ 1, 1, 1, 0 } }; // ROTATION_270
final int[] as = axisSwap[displayRotation];
screenVec[0] = (float)as[0] * canVec[ as[2] ];
screenVec[1] = (float)as[1] * canVec[ as[3] ];
screenVec[2] = canVec[2];
}
此解决方案由NVidia提供。查看他们关于Android的white paper 加速度计了解更多详情。
答案 1 :(得分:11)
只是想在Hartok的回答中添加一些东西,因为我起初并不理解......
我已经将方法重写为:
public static float[] adjustAccelOrientation(int displayRotation, float[] eventValues)
{
float[] adjustedValues = new float[3];
final int axisSwap[][] = {
{ 1, -1, 0, 1 }, // ROTATION_0
{-1, -1, 1, 0 }, // ROTATION_90
{-1, 1, 0, 1 }, // ROTATION_180
{ 1, 1, 1, 0 } }; // ROTATION_270
final int[] as = axisSwap[displayRotation];
adjustedValues[0] = (float)as[0] * eventValues[ as[2] ];
adjustedValues[1] = (float)as[1] * eventValues[ as[3] ];
adjustedValues[2] = eventValues[2];
return adjustedValues;
}
完全相同的事情,只是有更多用户友好的变量名称,我在内部重新创建浮动,因为我需要它... 只需调用此函数,放入getRotation和event.values浮点数组,检查其返回float数组的值,并选择您喜欢的任何数字......
希望这有助于某人!
答案 2 :(得分:7)
据我所知,这是因为设备的默认方向。 F.E.使用Honeycomb的新安卓平板电脑在手机上像风景一样保持纵向方向。
http://developer.android.com/reference/android/hardware/SensorEvent.html
在android文档中有以下信息:
坐标系是相对于手机屏幕定义的 在默认方向。设备的轴不会交换轴 屏幕方向改变。
X轴是水平的并且指向右侧,Y轴是 垂直和指向上方,Z轴指向外侧 屏幕的正面。在这个系统中,坐标后面 屏幕具有负Z值。
也许其中一个设备还具有横向作为纵向(默认)方向?
希望它能以某种方式帮助你。
答案 3 :(得分:4)
如前所述,默认屏幕方向因设备而异。加速度计坐标始终与设备默认方向匹配。屏幕坐标的行为不同。当设备旋转时,屏幕坐标也旋转,使得(0,0)始终是屏幕的当前左上角。在具有默认纵向方向的设备上,将方向锁定为纵向将确保传感器坐标沿与屏幕坐标相同的轴运行,而不管旋转方向如何。另一方面,在具有默认横向方向的设备上将屏幕方向锁定为纵向将导致传感器轴以与屏幕轴不同的方向运行。
本文:http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html更深入地解释了这一点,并为处理问题提供了解决方案。