Xamarin.Essentials:指南针

Compass 类使你能够监视设备的磁北航向。

入门

若要开始使用此 API,请阅读 Xamarin.Essentials 的入门指南,确保在项目中正确安装和设置库。

使用 Compass

在类中添加对 Xamarin.Essentials 的引用:

using Xamarin.Essentials;

通过调用 StartStop 方法来使用 Compass 功能以侦听罗盘的变化。 然后通过 ReadingChanged 事件反馈任何变化。 下面是一个示例:

public class CompassTest
{
    // Set speed delay for monitoring changes.
    SensorSpeed speed = SensorSpeed.UI;

    public CompassTest()
    {
        // Register for reading changes, be sure to unsubscribe when finished
        Compass.ReadingChanged += Compass_ReadingChanged;
    }

    void Compass_ReadingChanged(object sender, CompassChangedEventArgs e)
    {
        var data = e.Reading;
        Console.WriteLine($"Reading: {data.HeadingMagneticNorth} degrees");
        // Process Heading Magnetic North
    }

    public void ToggleCompass()
    {
        try
        {
            if (Compass.IsMonitoring)
              Compass.Stop();
            else
              Compass.Start(speed);
        }
        catch (FeatureNotSupportedException fnsEx)
        {
            // Feature not supported on device
        }
        catch (Exception ex)
        {
            // Some other exception has occurred
        }
    }
}

传感器速度

  • 最快 – 尽快获取传感器数据(不保证在 UI 线程上返回)。
  • 游戏 – 适合游戏的速度(不保证在 UI 线程上返回)。
  • 默认 - 适合屏幕方向更改的默认速率。
  • UI – 适合常规用户界面的速率。

如果事件处理程序不能保证在 UI 线程上运行,并且如果事件处理程序需要访问用户界面元素,请使用 MainThread.BeginInvokeOnMainThread 方法在 UI 线程上运行该代码。

平台实现细节

Android 不提供用于检索罗盘航向的 API。 我们使用 Google 推荐的方法,利用加速计和磁力计来计算磁北航向。

在极少数情况下,可能会看到不一致的结果,因为需要校准传感器,这就涉及到以 8 字形来移动设备。 进行此操作的最佳方式是打开 Google 地图,点击你所在的位置点,然后选择“校准罗盘”。

同时从应用运行多个传感器可能会调整传感器速度。

低通筛选器

根据 Android 罗盘值的更新和计算方式,可能需要平滑处理这些值。 可以应用一个低通滤波器来平均角度的正弦和余弦值,并且可以使用接受 Start 参数的 bool applyLowPassFilter 方法重载来启用此滤波器:

Compass.Start(SensorSpeed.UI, applyLowPassFilter: true);

该参数仅适用于 Android 平台,iOS 和 UWP 会忽略该参数。 可以在此处查看详细信息。

API

第 9 频道YouTube 上查找更多 Xamarin 视频。