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 (Максимальная) — максимально быстрое получение данных датчика (возврат в поток пользовательского интерфейса не гарантирован).
  • Game (Игра) — скорость, подходящая для игр (возврат в поток пользовательского интерфейса не гарантирован).
  • Normal (Нормальная) — скорость по умолчанию, которая подходит для изменений ориентации экрана.
  • UI (Пользовательский интерфейс) — скорость, которая подходит для типичного пользовательского интерфейса.

Если нет гарантии, что обработчик событий будет запущен в потоке пользовательского интерфейса, и этому обработчику событий требуется доступ к элементам интерфейса, используйте метод MainThread.BeginInvokeOnMainThread для запуска кода в потоке пользовательского интерфейса.

Особенности реализации для платформ

Android не предоставляет API для получения данных о направлении компаса. Для вычисления направления на северный магнитный полюс используются акселерометр и магнитометр. Именно такой поход рекомендует Google.

В редких случаях вы можете увидеть непоследовательные результаты, так как датчики нужно калибровать, что предполагает перемещение устройства "по восьмерке". Лучше всего открыть Карты Google, коснуться точки своего расположения и выбрать калибровку компаса.

При запуске из приложения одновременно множества датчиков возможно изменение их скорости.

Фильтр нижних частот

Из-за способа обновления и вычисления значений компаса Android может потребоваться сглаживание значений. Вы можете применить низкочастотный фильтр, который усредняет значения синуса и косинуса углов и может быть включен с помощью перегрузки метода Start, принимающего параметр bool applyLowPassFilter:

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

Это работает только на платформе Android. На iOS и UWP параметр игнорируется. Дополнительные сведения можно найти здесь.

API

Другие видео о Xamarin см. на Channel 9 и YouTube.