Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pelajari cara menggunakan kompas untuk menentukan judul saat ini.
Contoh ini membuat aplikasi sederhana yang bergantung pada kompas sebagai perangkat input. Aplikasi dapat memperoleh arah hadap saat ini terhadap utara magnetis atau utara sejati. Aplikasi navigasi menggunakan kompas untuk menentukan arah yang dihadapi perangkat lalu mengorientasikan peta yang sesuai.
- API Penting:Windows.Devices.Sensors, Compass
Note
Artikel ini berfokus pada kode yang menunjukkan cara menggunakan kompas. Untuk gambaran umum sensor kompas, lihat Sensor: Kompas.
Prasyarat
Anda harus terbiasa dengan sensor kompas dan penggunaannya. Lihat Sensor: Kompas.
Perangkat atau emulator yang Anda gunakan harus mendukung kompas.
Contoh kode
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>
Saat aplikasi berjalan, Anda dapat mengubah nilai kompas dengan memindahkan perangkat.
Contoh sebelumnya menunjukkan kode penting yang perlu Anda tulis untuk mengintegrasikan input kompas ke dalam aplikasi Anda.
Menyambungkan ke sensor
Panggil metode GetDefault untuk membuat koneksi dengan kompas default.
private Compass? compass;
// ...
compass = Compass.GetDefault();
Anda juga dapat memanggil FromIdAsync untuk membuat objek Compass dari nilai DeviceInformation.Id. Untuk informasi selengkapnya, lihat Menghitung perangkat.
Jika tidak ada sensor kompas yang terdeteksi, pesan status diperbarui untuk memberi tahu pengguna.
Mengatur interval laporan
Interval laporan diatur dalam konstruktor halaman. Kode ini mengambil interval minimum yang didukung oleh perangkat dan membandingkannya dengan interval yang diminta sebesar 16 milidetik (yang perkiraan laju refresh 60 Hz). Jika interval minimum yang didukung lebih besar dari interval yang diminta, kode akan mengatur nilai ke minimum. Jika tidak, nilainya diatur ke interval yang diminta.
uint minReportInterval = compass.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
compass.ReportInterval = reportInterval;
Baca data sensor
Data kompas baru diambil di penanganan aktivitas ReadingChanged . Setiap kali driver sensor menerima data baru dari sensor, driver tersebut meneruskan nilai ke aplikasi Anda menggunakan peristiwa ini. Untuk contoh ini, nilai baru ini ditulis ke blok teks yang ditemukan di XAML untuk halaman yang sesuai.
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.";
});
}
Topik terkait
Windows developer