Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aprenda a usar a bússola para determinar o rumo atual.
Este exemplo cria uma aplicação simples que depende da bússola como dispositivo de entrada. Uma aplicação pode obter a orientação atual em relação ao norte magnético ou ao norte verdadeiro. As aplicações de navegação usam a bússola para determinar a direção em que o dispositivo está virado e depois orientam o mapa em conformidade.
- APIs importantes: Windows. Devices.Sensors, Compass
Note
Este artigo foca-se em código que demonstra como usar uma bússola. Para uma visão geral do sensor bússola, veja Sensores: Bússola.
Pré-requisitos
Deves estar familiarizado com o sensor bússola e as suas utilizações. Ver Sensores: Bússola.
O dispositivo ou emulador que está a usar deve suportar uma bússola.
Código de exemplo
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>
Quando a aplicação corre, pode alterar os valores da bússola movendo o dispositivo.
O exemplo anterior demonstra o código essencial que precisa de escrever para integrar a entrada da bússola na sua aplicação.
Liga-te ao sensor
Chame o método GetDefault para estabelecer uma ligação com a bússola padrão.
private Compass? compass;
// ...
compass = Compass.GetDefault();
Também pode chamar FromIdAsync para criar um objeto Compass a partir de um valor DeviceInformation.Id. Para mais informações, consulte Enumerar dispositivos.
Se não for detetado o sensor bússola, a mensagem de estado é atualizada para informar o utilizador.
Definir o intervalo de relatório
O intervalo de relatório é definido dentro do construtor da página. Este código recupera o intervalo mínimo suportado pelo dispositivo e compara-o com um intervalo solicitado de 16 milissegundos (que aproxima uma taxa de atualização de 60 Hz). Se o intervalo mínimo suportado for maior do que o intervalo solicitado, o código define o valor para o mínimo. Caso contrário, define o valor para o intervalo solicitado.
uint minReportInterval = compass.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
compass.ReportInterval = reportInterval;
Ler dados dos sensores
Os novos dados da bússola são capturados no processador do evento ReadingChanged. Cada vez que o driver do sensor recebe novos dados do sensor, ele transmite os valores para a sua aplicação através deste evento. Neste exemplo, estes novos valores são escritos nos blocos de texto encontrados no XAML da página correspondente.
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.";
});
}
Tópicos relacionados
Windows developer