Usar la brújula

Aprenda a usar la brújula para determinar el encabezado actual.

En este ejemplo se crea una aplicación sencilla que se basa en una brújula como un dispositivo de entrada. Una aplicación puede obtener la orientación actual respecto del norte magnético o del norte verdadero. Las aplicaciones de navegación usan la brújula para determinar la dirección a la que se enfrenta un dispositivo y, a continuación, orientar un mapa en consecuencia.

Note

Este artículo se centra en el código que muestra cómo usar una brújula. Para obtener información general sobre el sensor de brújula, consulte Sensores: Brújula.

Prerequisites

Debe estar familiarizado con el sensor de brújula y sus usos. Consulte Sensores: Brújula.

El dispositivo o emulador que usa debe admitir una brújula.

Código de ejemplo

using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;

namespace DevicesDemo.Pages
{
    public sealed partial class CompassPage : Page
    {
        private Compass? compass;

        public CompassPage()
        {
            InitializeComponent();

            // Get the default compass object.
            compass = Compass.GetDefault(); 

            if (compass != null)
            {
                // Establish the report interval for all scenarios.
                uint minReportInterval = compass.MinimumReportInterval;
                uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                compass.ReportInterval = reportInterval;

                // Assign an event handler for the reading-changed event.
                compass.ReadingChanged += Compass_ReadingChanged;
            }
            else
            {
                statusBar.Message = "No compass was found.";
                statusBar.Severity = InfoBarSeverity.Error;
                statusBar.IsOpen = true;
            }
        }

        // This event handler writes the current compass
        // reading to the text blocks on the XAML page.
        private void Compass_ReadingChanged(Compass sender, CompassReadingChangedEventArgs args)
        {
            DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
            {
                CompassReading reading = args.Reading;
                txtMagnetic.Text = String.Format("{0,5:0.00}", reading.HeadingMagneticNorth);
                if (reading.HeadingTrueNorth.HasValue)
                    txtNorth.Text = String.Format("{0,5:0.00}", reading.HeadingTrueNorth);
                else
                    txtNorth.Text = "No reading.";
            });
        }
    }
}
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid Margin="24">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
        </Grid.RowDefinitions>
        <TextBlock Text="Magnetic Heading:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtMagnetic" Grid.Column="1" Text="---"/>

        <TextBlock Grid.Row="1" Text="True North Heading:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtNorth" Grid.Column="1" Grid.Row="1" Text="---"/>
    </Grid>

    <InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>

Cuando se ejecuta la aplicación, puedes cambiar los valores de brújula moviendo el dispositivo.

En el ejemplo anterior se muestra el código esencial que debe escribir para integrar la entrada de brújula en la aplicación.

Conexión al sensor

Llame al método GetDefault para establecer una conexión con la brújula predeterminada.

private Compass? compass;
// ...
compass = Compass.GetDefault();

También puede llamar a FromIdAsync para crear un objeto Compass desde un valor DeviceInformation.Id. Para obtener más información, consulta Enumerar dispositivos.

Si no se detecta ningún sensor de brújula, el mensaje de estado se actualiza para informar al usuario.

Establecimiento del intervalo de informe

El intervalo de informe se establece dentro del constructor de la página. Este código recupera el intervalo mínimo admitido por el dispositivo y lo compara con un intervalo solicitado de 16 milisegundos (que aproxima una frecuencia de actualización de 60 Hz). Si el intervalo mínimo admitido es mayor que el intervalo solicitado, el código establece el valor en el mínimo. De lo contrario, establece el valor en el intervalo solicitado.

uint minReportInterval = compass.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
compass.ReportInterval = reportInterval;

Leer datos del sensor

Los nuevos datos de brújula se capturan en el controlador de eventos ReadingChanged . Cada vez que el controlador del sensor recibe nuevos datos del sensor, pasa los valores a la aplicación mediante este evento. En este ejemplo, estos nuevos valores se escriben en los bloques de texto que se encuentran en el XAML de la página correspondiente.

compass.ReadingChanged += Compass_ReadingChanged;
// ...

private void Compass_ReadingChanged(Compass sender, CompassReadingChangedEventArgs args)
{
    DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        CompassReading reading = args.Reading;
        txtMagnetic.Text = String.Format("{0,5:0.00}", reading.HeadingMagneticNorth);
        if (reading.HeadingTrueNorth.HasValue)
            txtNorth.Text = String.Format("{0,5:0.00}", reading.HeadingTrueNorth);
        else
            txtNorth.Text = "No reading.";
    });
}