【发布时间】:2010-11-13 19:55:05
【问题描述】:
有 2 种方法可以获得 3 个旋转值(方位角、俯仰角、滚动角)。
其中一个正在注册一个 TYPE_ORIENTATION 类型的侦听器。这是最简单的方法,正如文档所述,我从每次旋转中都得到了正确的值范围: 方位角:[0, 359] 音高:[-180, 180] 滚动:[-90, 90]
另一个,最精确和最复杂的,你第一次看到它就明白了。 Android推荐它,所以我想用它,但我得到不同的值。
方位角:[-180, 180]。 -180/180 是 S,0 i N,90 E 和 -90 W。
音高:[-90, 90]。 90 是 90,-90 是 -90,0 是 0 但 -180/180(屏幕朝下)是 0。
滚动:[-180, 180]。
我应该得到相同的值,但使用小数,对吧?
我有以下代码:
aValues = new float[3];
mValues = new float[3];
sensorListener = new SensorEventListener (){
public void onSensorChanged (SensorEvent event){
switch (event.sensor.getType ()){
case Sensor.TYPE_ACCELEROMETER:
aValues = event.values.clone ();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
mValues = event.values.clone ();
break;
}
float[] R = new float[16];
float[] orientationValues = new float[3];
SensorManager.getRotationMatrix (R, null, aValues, mValues);
SensorManager.getOrientation (R, orientationValues);
orientationValues[0] = (float)Math.toDegrees (orientationValues[0]);
orientationValues[1] = (float)Math.toDegrees (orientationValues[1]);
orientationValues[2] = (float)Math.toDegrees (orientationValues[2]);
azimuthText.setText ("azimuth: " + orientationValues[0]);
pitchText.setText ("pitch: " + orientationValues[1]);
rollText.setText ("roll: " + orientationValues[2]);
}
public void onAccuracyChanged (Sensor sensor, int accuracy){}
};
请帮忙。这很令人沮丧。
我必须以这些价值观对待还是我做错了什么?
谢谢。
【问题讨论】:
-
我自己已经为此工作了大约 2 周。您的代码看起来应该是(根据我能够找到的文档),但正如您所指出的,它与 TYPE_ORIENTATION 传感器结果不匹配。检查orientationValues[0] 的负值并添加它似乎是一件简单的事情。但这还不够。您没有显示传感器更新的频率。我发现更快的更新可以获得更好的结果,即使 TYPE_ORIENTATION 结果看起来相当稳定。如果您想一起工作,请联系 davemac327@gmail.com
-
所有传感器速度都是GAME,但我认为问题与速度无关。这很奇怪,因为所有博客和论坛(以及我正在阅读的书!)都以相同的方式实现传感器。
-
好吧,每个人都说如何使用加速度计和磁场,但没有人说返回的值与 TYPE_ORIENTATION 不同,即使是官方文档也是如此。好工作的人。等待答案...
-
看看我的问题here。它可能有用。
标签: android orientation sensors device-orientation