2

我有一个非常具体的问题。


对于默认方向为纵向的 Android 设备(大多数手机),设备的轴方向如下:

手机的原生纵向

因此,当尝试使用向量和矩阵数学并且我需要为设备找到正确的、向上和向外的向量时,我可以使用以下方法,它非常有效

SensorManager.getRotationMatrix(tempRot, null, gravVals, geoMagVals);
SensorManager.remapCoordinateSystem(tempRot, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, rot);

Vector right  = new Vector(rot[0], rot[3], rot[6]); // the direction the right side of the phone is pointing
Vector up     = new Vector(rot[1], rot[4], rot[7]); // the direction the top side of the phone is pointing
Vector screen = new Vector(rot[2], rot[5], rot[8]); // the direction the screen is facing

对于默认方向为横向的 Android 设备(例如 Xoom),设备的轴方向如下:

平板电脑原生横向

因此,为了实现与手机上相同的向量,我使用以下有问题的方法:

SensorManager.getRotationMatrix(tempRot, null, gravVals, geoMagVals);
SensorManager.remapCoordinateSystem(tempRot, SensorManager.AXIS_X, SensorManager.AXIS_Y, rot); // this isn't really doing anything in this case

Vector right  = new Vector(rot[0], rot[3], rot[6]); // the direction the right side of the tablet is pointing
Vector up     = new Vector(rot[1], rot[4], rot[7]); // the direction the top side of the tablet is pointing
Vector screen = new Vector(rot[2], rot[5], rot[8]); // the direction the screen is facing

所以它在手机上运行良好,但在平板电脑上它只适用于左右和上下移动,但是当我尝试旋转设备时,突然数据不再有意义。我相信它实际上是在改变平板电脑的轴,使它们与默认的纵向轴(如手机)相匹配,并根据我拿着平板电脑的方式在 4 个可能的方向之间来回切换。

我的应用程序在清单中使用以下代码锁定在横向模式:

<activity android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation" .... />

以及该方法的推荐实现:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

我不明白为什么当我明确告诉它不要改变它的方向时,它仍然会改变它的方向。该应用程序在 Android 2.2 中运行,而平板电脑正在运行 3.0.1,因此清单中不需要“screenSize”标志(尽管我尝试过,但也没有帮助)。当这些奇怪的数据开始传入时,您会期望会调用一些事件方法,但是“onConfigurationChanged”和“onWindowAttributesChanged”都没有被调用,并且“Display.getRotation()”和“Display.getOrientation()”都是始终保持在 0。

谁能告诉我如何获得平板电脑右侧、平板电脑顶部和平板电脑屏幕指向的三个向量?以及如何停止旋转平板电脑引起的问题。

这是 nVidia 关于 Xoom 的信息

4

0 回答 0