Xamarin.Essentials:コンパス

Compass クラスを使用すると、デバイスの磁北方位を監視することができます。

作業開始

この API の使用を始めるには、Xamarin.Essentials の概要ガイドを読み、ライブラリが正しくインストールされてプロジェクトに設定されていることを確認してください。

Compass の使用

クラスの Xamarin.Essentials への参照を追加します。

using Xamarin.Essentials;

Compass の機能は、ジコンパスの変化をリッスンする Start および Stop メソッドを呼び出すことで動作します。 すべての変更は 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
        }
    }
}

センサーの速度

  • Fastest – センサー データを最高速度で取得します (UI スレッドに返ることが保証されません)。
  • Game – ゲームに適した速度です (UI スレッドに返ることが保証されません)。
  • Default – 画面の向きの変更に適した既定の速度です。
  • UI – 一般的なユーザー インターフェイスに適した速度です。

イベント ハンドラーが UI スレッドでの実行を保証されておらず、そのイベント ハンドラーでユーザー インターフェイス要素にアクセスする必要がある場合は、MainThread.BeginInvokeOnMainThread メソッドを使用してそのコードを UI スレッドで実行します。

プラットフォームの実装の詳細

Android には、コンパスの方位を取得するための API はありません。 Google の推奨に従い、加速度計と磁気探知器を利用して磁北方位を計算します。

まれに、8 の字を描くようにデバイスを動かしたときなど、センサーの調整が必要なために、一貫性のない結果が表示されることがあります。 これを行う最善の方法は、Google マップを開き、場所のドットをタップして、 [Calibrate compass](場所の調整) を選択します。

アプリから同時に複数のセンサーを実行すると、センサーの速度が調整されます。

ローパス フィルター

Android コンパスの値が更新および計算される方法のため、値の平滑化が必要な場合があります。 角度のサイン値とコサイン値の平均を計算する "ローパス フィルター" を適用でき、bool applyLowPassFilter パラメーターを受け入れる Start メソッドのオーバーロードを使用してオンにできます。

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

これは、Android のプラットフォームでのみ適用され、iOS および UWP ではパラメーターが無視されます。 詳しくは、こちらをご覧ください。

API

他の Xamarin ビデオは、Channel 9 および YouTube でご覧いただけます。