Usar la brújulaUse the compass

API importantesImportant APIs

EjemploSample

Aprende a usar la brújula para determinar el rumbo actual.Learn how to use the compass to determine the current heading.

Una aplicación puede devolver la orientación actual con respecto al norte magnético o verdadero.An app can retrieve the current heading with respect to magnetic, or true, north. Las aplicaciones de navegación usan la brújula para determinar la dirección de un dispositivo y orientar el mapa según corresponda.Navigation apps use the compass to determine the direction a device is facing and then orient the map accordingly.

PrerrequisitosPrerequisites

Debes estar familiarizado con el lenguaje XAML, Microsoft Visual C# y eventos.You should be familiar with Extensible Application Markup Language (XAML), Microsoft Visual C#, and events.

El dispositivo o emulador que estés usando debe tener una brújula.The device or emulator that you're using must support a compass.

Crear una aplicación de brújula simpleCreate a simple compass app

Esta sección se divide en dos subsecciones:This section is divided into two subsections. En la primera subsección, conocerás los pasos necesarios para crear una aplicación de brújula simple desde cero.The first subsection will take you through the steps necessary to create a simple compass application from scratch. En la siguiente subsección se aplica la aplicación que acabas de crear.The following subsection explains the app you have just created.

InstructionsInstructions

  • Crea un nuevo proyecto. Para ello, elige una Aplicación vacía (Windows universal) en las plantillas de proyecto Visual C#.Create a new project, choosing a Blank App (Universal Windows) from the Visual C# project templates.

  • Abre el archivo MainPage.xaml.cs del proyecto y reemplaza el código existente con lo siguiente.Open your project's MainPage.xaml.cs file and replace the existing code with the following.

    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);
                }
            }
        }
    }
    ```

You'll need to rename the namespace in the previous snippet with the name you gave your project. For example, if you created a project named **CompassCS**, you'd replace `namespace App1` with `namespace CompassCS`.

-   Open the file MainPage.xaml and replace the original contents with the following XML.

```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ás reemplazar la primera parte del nombre de la clase en el fragmento anterior por el espacio de nombres de tu aplicación.You'll need to replace the first part of the class name in the previous snippet with the namespace of your app. Por ejemplo, si creaste un proyecto denominado CompassCS, reemplazarías x:Class="App1.MainPage" por x:Class="CompassCS.MainPage".For example, if you created a project named CompassCS, you'd replace x:Class="App1.MainPage" with x:Class="CompassCS.MainPage". También deberás reemplazar xmlns:local="using:App1" por xmlns:local="using:CompassCS".You should also replace xmlns:local="using:App1" with xmlns:local="using:CompassCS".

  • Presione F5 o seleccione depurar > iniciar depuración para compilar, implementar y ejecutar la aplicación.Press F5 or select Debug > Start Debugging to build, deploy, and run the app.

Con la aplicación en ejecución, puedes cambiar los valores de brújula moviendo el dispositivo o usando herramientas del emulador.Once the app is running, you can change the compass values by moving the device or using the emulator tools.

  • Para detener la aplicación, vuelva a Visual Studio y presione Mayús + F5 o seleccione depurar > detener depuración para detener la aplicación.Stop the app by returning to Visual Studio and pressing Shift+F5 or select Debug > Stop Debugging to stop the app.

ExplicaciónExplanation

En el ejemplo anterior, se muestra el poco código que debes escribir para poder integrar los datos de entrada de la brújula en la aplicación.The previous example demonstrates how little code you'll need to write in order to integrate compass input in your app.

La aplicación establece una conexión con la brújula predeterminada en el método MainPage.The app establishes a connection with the default compass in the MainPage method.

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

La aplicación establece el intervalo de informes en el método MainPage.The app establishes the report interval within the MainPage method. Este código recupera el intervalo mínimo admitido por el dispositivo y lo compara con un intervalo solicitado de 16 milisegundos (el cual se aproxima a una frecuencia de actualización de 60 Hz).This code retrieves the minimum interval supported by the device and compares it to a requested interval of 16 milliseconds (which approximates a 60-Hz refresh rate). Si el intervalo mínimo admitido es mayor que el intervalo solicitado, el código establece el valor en el mínimo.If the minimum supported interval is greater than the requested interval, the code sets the value to the minimum. De lo contrario, establece el valor en el intervalo solicitado.Otherwise, it sets the value to the requested interval.

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

Los nuevos datos de la brújula se capturan en el método ReadingChanged.The new compass data is captured in the ReadingChanged method. Cada vez que el controlador del sensor recibe nuevos datos del sensor, pasa los valores a la aplicación mediante este controlador de eventos.Each time the sensor driver receives new data from the sensor, it passes the values to your app using this event handler. La aplicación registra este controlador de eventos en la siguiente línea.The app registers this event handler on the following line.

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

Estos nuevos valores se escriben en los bloques de texto que se encuentran en el código XAML del proyecto.These new values are written to the TextBlocks found in the project's XAML.

 <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"/>