Xamarin.Essentials: Brújula

La clase Compass permite supervisar la dirección del norte magnético del dispositivo.

Primeros pasos

Para empezar a usar esta API, lea la guía de introducción para Xamarin.Essentials con el fin de asegurarse de que la biblioteca está correctamente instalada y configurada en los proyectos.

Uso de Compass

Agregue una referencia a Xamarin.Essentials en la clase:

using Xamarin.Essentials;

La funcionalidad Compass funciona mediante una llamada a los métodos Start y Stop para realizar escuchas de los cambios realizados en la brújula. Los cambios se enviarán a través del evento ReadingChanged. A continuación se muestra un ejemplo:

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
        }
    }
}

Velocidad de sensor

  • Más rápido: obtener los datos del sensor tan rápido como sea posible (no se garantiza la devolución en el subproceso de interfaz de usuario).
  • Juego: velocidad adecuada para juegos (no se garantiza la devolución en el subproceso de interfaz de usuario).
  • Predeterminado: velocidad predeterminada adecuada para los cambios de orientación de pantalla.
  • Interfaz de usuario: velocidad adecuada para la interfaz de usuario general.

Si no se garantiza la ejecución del controlador de eventos en el subproceso de interfaz de usuario y si el controlador de eventos necesita tener acceso a elementos de la interfaz de usuario, use el método MainThread.BeginInvokeOnMainThread para ejecutar ese código en el subproceso de interfaz de usuario.

Detalles de implementación de la plataforma

Android no proporciona una API para recuperar la dirección de la brújula. El acelerómetro y el magnetómetro se usan para calcular la dirección del norte magnético, lo que recomienda Google.

En casos poco habituales, es posible que vea resultados incoherentes porque sea necesario calibrar los sensores, lo que implica mover el dispositivo describiendo un ocho. La mejor manera de hacerlo es abrir Google Maps, pulsar en el punto de la ubicación y seleccionar Calibrar la brújula.

La ejecución simultánea de varios sensores desde la aplicación puede ajustar la velocidad del sensor.

Filtro de paso bajo

Debido a la forma de calcular y actualizar los valores de la brújula de Android, es posible que sea necesario suavizarlos. Se puede aplicar un filtro de paso bajo que calcula el promedio de los valores de seno y coseno de los ángulos y que se puede activar si se sobrecarga el método Start, que acepta el parámetro bool applyLowPassFilter:

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

Esto solo se aplica a la plataforma Android; el parámetro se ignora en iOS y UWP. Puede leer más información aquí.

API

Encuentre más vídeos de Xamarin en Channel 9 y YouTube.