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 ではパラメーターが無視されます。 詳しくは、こちらをご覧ください。