我正在测试两个不同设备(Elocity A7 和 Archos 7 Home tablet)的加速度计输出,但传感器似乎给出了不同的结果。我已经将其设置为横屏模式,但是在两台设备之间,x轴和y轴似乎相反。当垂直于地面时,x轴返回10,而Archos X轴则返回0。Elocity平板电脑运行的是Android 2.2,而Archos运行的是2.1。有人能指导我如何使这两个设备之间的加速度计方向保持同步吗?
我正在测试两个不同设备(Elocity A7 和 Archos 7 Home tablet)的加速度计输出,但传感器似乎给出了不同的结果。我已经将其设置为横屏模式,但是在两台设备之间,x轴和y轴似乎相反。当垂直于地面时,x轴返回10,而Archos X轴则返回0。Elocity平板电脑运行的是Android 2.2,而Archos运行的是2.1。有人能指导我如何使这两个设备之间的加速度计方向保持同步吗?
实际上,加速度计轴相对于设备的默认方向。
以下是如何处理它的方法:
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加速度计的更多详细信息。
我想在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;
}
这其实就是同样的东西,只不过使用了更加用户友好的变量名,并且我重新创建了float内部,因为我需要这样做... 只需调用此函数,将getRotation和event.values float数组输入其中,检查其返回的float数组的值并选择您喜欢的数字即可...
希望这能对某些人有所帮助!
http://developer.android.com/reference/android/hardware/SensorEvent.html
在安卓文档中提到了以下信息: