Xamarin.Essentials: コンパスXamarin.Essentials: Compass

Compass クラスを使用すると、デバイスの磁北方位を監視することができます。The Compass class lets you monitor the device's magnetic north heading.

作業開始Get started

この API の使用を始めるには、Xamarin.Essentials の概要ガイドを読み、ライブラリが正しくインストールされてプロジェクトに設定されていることを確認してください。To start using this API, read the getting started guide for Xamarin.Essentials to ensure the library is properly installed and set up in your projects.

Compass の使用Using Compass

自分のクラスに Xamarin.Essentials への参照を追加します。Add a reference to Xamarin.Essentials in your class:

using Xamarin.Essentials;

Compass の機能は、ジコンパスの変化をリッスンする Start および Stop メソッドを呼び出すことで動作します。The Compass functionality works by calling the Start and Stop methods to listen for changes to the compass. すべての変更は ReadingChanged イベントを通じて戻されます。Any changes are sent back through the ReadingChanged event. 次に例を示します。Here is an example:

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()
            if (Compass.IsMonitoring)
        catch (FeatureNotSupportedException fnsEx)
            // Feature not supported on device
        catch (Exception ex)
            // Some other exception has occurred

センサーの速度Sensor Speed

  • Fastest – センサー データを最高速度で取得します (UI スレッドに返ることが保証されません)。Fastest – Get the sensor data as fast as possible (not guaranteed to return on UI thread).
  • Game – ゲームに適した速度です (UI スレッドに返ることが保証されません)。Game – Rate suitable for games (not guaranteed to return on UI thread).
  • Normal – 画面の向きの変更に適した既定の速度です。Normal – Default rate suitable for screen orientation changes.
  • UI – 一般的なユーザー インターフェイスに適した速度です。UI – Rate suitable for general user interface.

イベント ハンドラーが UI スレッドでの実行を保証されておらず、そのイベント ハンドラーでユーザー インターフェイス要素にアクセスする必要がある場合は、MainThread.BeginInvokeOnMainThread メソッドを使用してそのコードを UI スレッドで実行します。If your event handler is not guaranteed to run on the UI thread, and if the event handler needs to access user-interface elements, use the MainThread.BeginInvokeOnMainThread method to run that code on the UI thread.

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

Android には、コンパスの方位を取得するための API はありません。Android does not provide a API for retrieving the compass heading. Google の推奨に従い、加速度計と磁気探知器を利用して磁北方位を計算します。We utilize the accelerometer and magnetometer to calculate the magnetic north heading, which is recommended by Google.

まれに、8 の字を描くようにデバイスを動かしたときなど、センサーの調整が必要なために、一貫性のない結果が表示されることがあります。In rare instances, you maybe see inconsistent results because the sensors need to be calibrated, which involves moving your device in a figure-8 motion. これを行う最善の方法は、Google マップを開き、場所のドットをタップして、 [Calibrate compass](場所の調整) を選択します。The best way of doing this is to open Google Maps, tap on the dot for your location, and select Calibrate compass.

アプリから同時に複数のセンサーを実行すると、センサーの速度が調整される場合があることに注意してください。Be aware that running multiple sensors from your app at the same time may adjust the sensor speed.

ローパス フィルターLow Pass Filter

Android コンパスの値が更新および計算される方法のため、値の平滑化が必要な場合があります。Due to how the Android compass values are updated and calculated there may be a need to smooth out the values. 角度のサイン値とコサイン値の平均を計算する "ローパス フィルター" を適用でき、bool applyLowPassFilter パラメーターを受け入れる Start メソッドのオーバーロードを使用してオンにできます。A Low Pass Filter can be applied that averages the sine and cosine values of the angles and can be turned on by using the Start method overload which accepts the bool applyLowPassFilter parameter:

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

これは、Android のプラットフォームでのみ適用され、iOS および UWP ではパラメーターが無視されます。This is only applied on the Android platform, and the parameter is ignored on iOS and UWP. 詳しくは、こちらをご覧ください。More information can be read here.