【发布时间】:2012-04-30 14:00:00
【问题描述】:
我正在制作一个地图应用程序,包括显示你所面对方向的位置箭头,如下所示:
我直接从SensorManager.getOrientation() 获取方向,使用第一个返回值:方位角。当握住手机使屏幕指向地平线上方并且纵向时,箭头可以正常工作。然而:
- 当手持手机使屏幕指向地平线以下时,箭头指向的方向与用户所面对的方向相差 180 度。
- 当手机被握在屏幕的朝向与地平线齐平时,箭头不知道它指向哪个方向。 Azimuth 根本不会返回有意义的结果。
- 当手机向左或向右倾斜(或以横向模式握住)时,箭头向左或向右倾斜。
下面精心构建且科学的图像显示了我的意思(其中蓝色是用户面向,红色是箭头方向,屏幕大致面向用户的面部,Google 地图正是我想要的):
(请注意,使用 Google 地图,如果关闭自动旋转,它不会成功执行列表中的最后两个操作。但我什至还没有到那个阶段。一次一件事。)
它看起来好像只是使用 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;
}
我做错了什么?有没有更简单的方法来做到这一点?
编辑:为了澄清,我假设用户将设备放在他们面前,并且屏幕指向他们。除此之外,我显然无法判断它们是否只有一个旋转。另外,我使用的是用户移动时的动作,但这是针对他们静止时的。
【问题讨论】:
-
科学形象+1
-
您的问题解决了吗?你是如何获得 lastAcceleration、lastMagneticField 的?
-
不。一直没有解决。也许它永远无法解决,而且谷歌地图似乎没有我当时想的那么聪明。我早就把它从我需要做的任务列表中删除了,因为我不再为同一家公司工作,更不用说同一个项目了。无论如何,Android 现在的工作方式可能完全不同。