Xamarin.Essentials:指南 針

羅盤類別可讓您監視裝置的磁北方位。

開始使用

若要開始使用此 API,請閱讀 入門指南Xamarin.Essentials,以確保連結庫已正確安裝並設定在您的專案中。

使用羅盤

在類別中新增 的 Xamarin.Essentials 參考:

using Xamarin.Essentials;

羅盤功能的運作方式是呼叫 StartStop 方法,以觀察羅盤的變化。 所有變化都會透過 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 羅盤值的更新和計算方式,可能需要將值平滑。 您可以套用低傳遞篩選,以平均角度的正弦值和餘弦值,bool applyLowPassFilter而且可以使用接受 參數的方法多載來開啟Start

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

僅會在 Android 平台上套用此項,在 iOS 及 UWP 上則會略過此參數。 可以在這裡閱讀詳細資訊。

API

Channel 9YouTube 上尋找更多 Xamarin 影片。