我有一个非常具体的问题。
对于默认方向为纵向的 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。
谁能告诉我如何获得平板电脑右侧、平板电脑顶部和平板电脑屏幕指向的三个向量?以及如何停止旋转平板电脑引起的问题。