我正在制作一个地图应用程序,包括向您显示您面对的方向的位置箭头,如下所示:
我直接从 获取方向SensorManager.getOrientation()
,使用第一个返回值:方位角。当握住手机使屏幕指向地平线上方并且纵向时,箭头可以正常工作。然而:
- 当手持手机使屏幕指向地平线以下时,箭头指向的方向与用户所面对的方向相差 180 度。
- 当手机被握在屏幕的朝向与地平线齐平时,箭头不知道它指向哪个方向。Azimuth 根本不会返回有意义的结果。
- 当手机向左或向右倾斜(或以横向模式握住)时,箭头向左或向右倾斜。
下面精心构建的科学图像显示了我的意思(其中蓝色是用户面向,红色是箭头方向,屏幕大致面向用户的面部,Google Maps 正是我想要的):
(请注意,使用谷歌地图,如果自动旋转关闭,它不会成功执行列表中的最后两个操作。但我什至还没有到那个阶段。一次一件事。)
看起来好像它只是使用 Y 轴指向方向,如下所示:http: //developer.android.com/reference/android/hardware/SensorEvent.html,当我希望它使用 Z 轴指向方向的反向时,大多数时候,和手机平放时的 Y。但是,考虑到getOrientation()
返回的值,我必须编写复杂的案例来解决一些问题,而面向手机的地平线用例是无法解决的。我敢肯定有一个更简单的方法。
这是我的代码(lastAcceleration 和 lastMagneticField 都来自内部传感器):
float[] rotationMatrix = new float[9];
if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){
float[] orientMatrix = new float[3];
SensorManager.getOrientation(rotationMatrix, orientMatrix);
orientation = orientMat[0]*180/(float)Math.PI;
}
我究竟做错了什么?有没有更简单的方法来做到这一点?
编辑:为了澄清,我假设用户将设备放在他们面前,并且屏幕指向他们。除此之外,我显然无法判断它们是否只有一个旋转。另外,我使用的是用户移动时的动作,但这是针对他们静止时的。