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 параметр игнорируется. Дополнительные сведения можно найти здесь.