所以,我一直在努力在我的Android Compass中修复这个bug 2天了。 基本上我正在尝试使用Xamarin.Android构建一个Qibla指南针。第一步应该是建立一个指向北方的指南针。
我已经从我的指南针的this教程中翻译了JAVA代码,以显示正确的北方。
I am simply rotating my Relative Layout which contains my Compass Image whenever Sensor reading Changes.
我试过直觉调整代码,但这个简单的指南针并不喜欢呆在一个地方。我只是试图将我的指南针图像的北方与磁北方对齐。
然而,我的指南针从未显示正确的北方,北方也在不断变化。
要检查我的设备Compass确实有效,我从Playstore测试了一个应用程序,它运行得很顺利。
我的活动:
public class QiblaDirectionActivity : Activity, ISensorEventListener
//all the right inherits done
我的设计代码片段:
<RelativeLayout
android:layout_width="wrap_content"
android:id="@+id/qiblaRL"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/qiblaCompass"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:layout_centerInParent="true"
android:src="@drawable/compass" />
<ImageView
android:id="@+id/qiblaArrow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:layout_centerInParent="true"
android:src="@drawable/needle" />
</RelativeLayout>
我的后端:
float currentCompassDegree = 0f;
public void OnSensorChanged(SensorEvent e)
{
//I have checked the accuracy its high
RotateAnimation ra = new RotateAnimation(currentCompassDegree,-e.Values[0], Dimension.RelativeToSelf, 0.5f, Dimension.RelativeToSelf, 0.5f);
ra.Duration = 120;
ra.FillAfter = true;
qiblaRL.StartAnimation(ra);
currentCompassDegree = -e.Values[0];
}
我在这里注册我的听众:
protected override void OnResume()
{
base.OnResume();
if (_sensorManager != null)
{
var mF = _sensorManager.GetDefaultSensor(SensorType.MagneticField);
_sensorManager.RegisterListener(this, mF, SensorDelay.Ui);
qiblaAdvice.Text= "(Align Device Properly)";
}
else
{
qiblaAdvice.Text = "(Device doesn't support Compass)";
}
}
我在这里取消注册:
protected override void OnPause()
{
base.OnPause();
if (_sensorManager != null)
{
_sensorManager.UnregisterListener(this);
}
}
答案 0 :(得分:1)
您需要对其进行采样和平滑。
这是一个答案,有人将高通滤波器样本从Apple / iOS转换为Android以获取加速度计读数,但我将其用于其他平滑目的,您可以将其从三个轴上剥离。就像我做过的那样:
您可以查看从 当前偏差中获得的偏移量,并调整您从传感器获得的读数。
关于这一点有很多问题/答案,这里只有一个:
来自真北的磁场水平分量的偏角,以度为单位(即正值表示磁场从真北向东旋转很多)。
有关补偿手机Tilt和Pitch的有趣答案: