Compartir a través de


Usar la brújula

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

API importantes

Requisitos previos

Debes estar familiarizado con el lenguaje de marcado extensible de aplicaciones (XAML), Microsoft Visual C# y eventos.

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

Creación de una aplicación de brújula sencilla

Una aplicación puede recuperar el encabezado actual con respecto al norte magnético, o true. 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 el mapa en consecuencia.

Nota:

Para obtener una implementación más completa, consulte el ejemplo de brújula.

Instrucciones

  • Cree un nuevo proyecto y elija una aplicación en blanco (Windows universal) en las plantillas de proyecto de Visual C# .

  • Abra el archivo MainPage.xaml.cs del proyecto y reemplace el código existente por lo siguiente.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;

    using Windows.UI.Core; // Required to access the core dispatcher object
    using Windows.Devices.Sensors; // Required to access the sensor platform and the compass


    namespace App1
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            private Compass _compass; // Our app' s compass object

            // This event handler writes the current compass reading to
            // the textblocks on the app' s main page.

            private async void ReadingChanged(object sender, CompassReadingChangedEventArgs e)
            {
               await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    CompassReading reading = e.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.";
                });
            }

            public MainPage()
            {
                this.InitializeComponent();
               _compass = Compass.GetDefault(); // Get the default compass object

                // Assign an event handler for the compass reading-changed event
                if (_compass != null)
                {
                    // Establish the report interval for all scenarios
                    uint minReportInterval = _compass.MinimumReportInterval;
                    uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                    _compass.ReportInterval = reportInterval;
                    _compass.ReadingChanged += new TypedEventHandler<Compass, CompassReadingChangedEventArgs>(ReadingChanged);
                }
            }
        }
    }

Deberá cambiar el nombre del espacio de nombres en el fragmento de código anterior con el nombre que asignó al proyecto. Por ejemplo, si creó un proyecto denominado CompassCS, reemplazaría por namespace App1 namespace CompassCS.

  • Abra el archivo MainPage.xaml y reemplace el contenido original por el siguiente XML.
    <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">

        <Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
            <TextBlock HorizontalAlignment="Left" Height="22" Margin="8,18,0,0" TextWrapping="Wrap" Text="Magnetic Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFFBF9F9"/>
            <TextBlock HorizontalAlignment="Left" Height="18" Margin="8,58,0,0" TextWrapping="Wrap" Text="True North Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFF3F3F3"/>
            <TextBlock x:Name="txtMagnetic" HorizontalAlignment="Left" Height="22" Margin="130,18,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFFBF6F6"/>
            <TextBlock x:Name="txtNorth" HorizontalAlignment="Left" Height="18" Margin="130,58,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFF5F1F1"/>

         </Grid>
    </Page>

Deberá reemplazar la primera parte del nombre de clase en el fragmento de código anterior por el espacio de nombres de la aplicación. Por ejemplo, si creó un proyecto denominado CompassCS, reemplazaría por x:Class="App1.MainPage" x:Class="CompassCS.MainPage". También debe reemplazar por xmlns:local="using:App1" xmlns:local="using:CompassCS".

  • Presione F5 o seleccione Depurar Iniciar depuración> para compilar, implementar y ejecutar la aplicación.

Una vez que se ejecuta la aplicación, puedes cambiar los valores de brújula moviendo el dispositivo o usando las herramientas del emulador.

  • Detenga la aplicación volviendo a Visual Studio y presionando Mayús+F5 o seleccione Depurar Detener depuración> para detener la aplicación.

Explicación

En el ejemplo anterior se muestra la poca cantidad de código que necesitará escribir para integrar la entrada de brújula en la aplicación.

La aplicación establece una conexión con la brújula predeterminada en el método MainPage .

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

La aplicación establece el intervalo de informe dentro del método MainPage . 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;

Los nuevos datos de brújula se capturan en el método ReadingChanged . Cada vez que el controlador del sensor recibe nuevos datos del sensor, pasa los valores a la aplicación mediante este controlador de eventos. La aplicación registra este controlador de eventos en la línea siguiente.

_compass.ReadingChanged += new TypedEventHandler<Compass,
CompassReadingChangedEventArgs>(ReadingChanged);

Estos nuevos valores se escriben en los TextBlocks que se encuentran en el XAML del proyecto.

 <TextBlock HorizontalAlignment="Left" Height="22" Margin="8,18,0,0" TextWrapping="Wrap" Text="Magnetic Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFFBF9F9"/>
 <TextBlock HorizontalAlignment="Left" Height="18" Margin="8,58,0,0" TextWrapping="Wrap" Text="True North Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFF3F3F3"/>
 <TextBlock x:Name="txtMagnetic" HorizontalAlignment="Left" Height="22" Margin="130,18,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFFBF6F6"/>
 <TextBlock x:Name="txtNorth" HorizontalAlignment="Left" Height="18" Margin="130,58,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFF5F1F1"/>