电子罗盘,也叫数字指南针,是利用地磁场来定北极的一种方法。WP手机设备里面我们可以利用罗盘传感器的API来实现电子罗盘的功能。
(1)调用
罗盘传感器的类:Compass
该类位于Microsoft.Devices.Sensors的命名空间,在开始的时候,需要使用using引入;
(2)Compass的属性,事件,方法
| 事件 | 说明 |
|---|---|
| ReadingChanged | Occurs each time the compass reports a new sensor reading. |
| 方法 | 说明 |
|---|---|
| GetCurrentReading | Gets the current compass reading. |
| GetDefault | Returns the default compass. |
| 属性 | 访问类型 | 说明 |
|---|---|---|
MinimumReportInterval | 只读 | Gets the minimum report interval supported by the compass. |
ReportInterval | 读/写 | Gets or sets the current report interval for the compass. |
(3)实现电子罗盘:
xaml文件:
<Page
x:Class="Toly.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Toly"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel >
<TextBlock Text="磁场北:"/>
<TextBlock x:Name="magneticNorth" Foreground="#FFC8C7CC"/>
<TextBlock Text="地理北:"/>
<TextBlock x:Name="trueNorth" Foreground="#FFC8C7CC"/>
<TextBlock Text="精度"/>
<TextBlock x:Name="headingAccuracy" Foreground="#FFC8C7CC"/>
<Grid>
<Ellipse Height="375" Width="375"
HorizontalAlignment="Center"
VerticalAlignment="Center"
x:Name="EllipseBorder"
Stroke="#FFF80D0D" StrokeThickness="2"
Fill="White"/>
<Image Height="263" Width="263" HorizontalAlignment="Center"
VerticalAlignment="Center" x:Name="CompassFace"
Source="Assets/compass.png" Stretch="None"/>
<Ellipse Height="263" Width="263" x:Name="EllipseGlass"
Stroke="Black" StrokeThickness="1">
<Ellipse.Fill>
<LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
<GradientStop Color="#A5000000" Offset="0"/>
<GradientStop Color="#BFFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
<Grid>
<Image Height="200" Width="200" HorizontalAlignment="Center"
VerticalAlignment="Center"
Source="Assets/calibrate_compass3.png"
x:Name="CompassSuggest" />
</Grid>
</StackPanel>
</Page>实现的效果图如下:

这个上述的xaml不过多介绍,接下来,我们重点看的是C#的代码
//mainpage加载完成,实例化罗盘对象
private async void MainPage_Loaded(object sender , RoutedEventArgs e) {
compass = Compass.GetDefault();//得到罗盘对象
if (compass == null) {
await new Windows.UI.Popups.MessageDialog("不支持罗盘传感器").ShowAsync();
return;
}
compass.ReadingChanged += compass_ReadingChanged;//开始监听事件
}private async void compass_ReadingChanged(object sender, CompassReadingChangedEventArgs args)
{
//Lambda 表达式
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
//args是罗盘对象数据的类的基类,用于传递事件的细节。
CompassReading reading = args.Reading;
magneticNorth.Text = string.Format("{0,5:0.00}",reading.HeadingMagneticNorth);
if(reading.HeadingTrueNorth != null)
{
trueNorth.Text = string.Format("{0,5:0.00}", reading.HeadingTrueNorth);
}
else
{
trueNorth.Text = "没有数据";
}
switch(reading.HeadingAccuracy){
//准确性不可用
case MagnetometerAccuracy.Unknown:
headingAccuracy.Text = "请按照下方图片移动方向移动手机";
if (CompassSuggest.Visibility != Visibility.Visible)
{
CompassSuggest.Visibility = Visibility.Visible;
}
break;
//高精度,不需要校准
case MagnetometerAccuracy.High:
headingAccuracy.Text = "高精度";
if (CompassSuggest.Visibility == Visibility.Visible)
{
CompassSuggest.Visibility = Visibility.Collapsed;
}
break;
//实际值和报告值高度不准确,需要用户校准
case MagnetometerAccuracy.Unreliable:
headingAccuracy.Text = "请按照下方图片移动方向移动手机";
if (CompassSuggest.Visibility != Visibility.Visible)
{
CompassSuggest.Visibility = Visibility.Visible;
}
break;
//实际值和报告值不同,但其准确性已足以满足某些应用领域
case MagnetometerAccuracy.Approximate:
headingAccuracy.Text = "一般精度";
if (CompassSuggest.Visibility == Visibility.Visible)
{
CompassSuggest.Visibility = Visibility.Collapsed;
}
break;
default:
if (CompassSuggest.Visibility != Visibility.Visible)
{
CompassSuggest.Visibility = Visibility.Visible;
}
headingAccuracy.Text = "请按照下方图片移动方向移动手机";
break;
}
double TrueHeading = reading.HeadingTrueNorth.Value;
//电子磁盘的角度调整
CompassFace.RenderTransformOrigin = new Point(0.5,0.5);
EllipseGlass.RenderTransformOrigin = new Point(0.5,0.5);
RotateTransform transform = new RotateTransform();
transform.Angle = 360 - TrueHeading;//偏移的角度
CompassFace.RenderTransform = transform;
EllipseGlass.RenderTransform = transform;
});
}