博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows 8 应用商店应用开发 之 检测方向的传感器(1)指南针
阅读量:5047 次
发布时间:2019-06-12

本文共 3692 字,大约阅读时间需要 12 分钟。

通过对前面内容的介绍,大家已经了解了如何获取响应运动传感器的数据,本节将介绍有关捕获方向传感器API的用法,利用这些API可以实现获取方向、屏幕自动适应设备旋转等功能。本节所有传感器是由Windows.Devices.Sensors命名空间支持,下面将介绍指南针、返回的方向传感器和检测设备方向的传感器。

指南针

指南针传感器用来测量当前设备相对于北极的偏转角度,在导航应用中,可以使用指南针来确定设备正面向的方向,然后相应的在地图上定位。下面通过示例介绍指南针API的使用。

新建一个名字为“CompassExample”的Windows应用商店的空白应用程序项目,在MainPage.xaml文件的Grid元素中添加如下前台代码。

<TextBlock Text="获取指南针读数" FontSize="20" Height="30" Margin="127,36,1082,702"/>

<!--按钮控件-->

<Button Name="GetDataButton" Content="获取读数" Click="GetData_Click" Margin="109,126,0,604"/>

<Button Name="CloseButton" Content="停止"  Click="CloseData_Click" Margin="220,126,0,604"/>

<!--文本控件-->

<TextBlock Name="InfoText" FontSize="18" Height="50" Margin="1,207,908,511"/>

<TextBlock  Text="磁北方向" FontSize="18" Margin="109,86,1133,642"  Width="124" Height="40"/>

<TextBlock x:Name="ScenarioOutput_MagneticNorth"  Text="没有数据" FontSize="18" Margin="214,86,1082,642" Height="40"/>

在上面的代码中,放置了多个显示信息的TextBlock控件,其中有一个用于显示指南针数据。然后又添加了两个按钮,一个用于启动指南针数据获取,另外一个按钮则用于停止数据获取。

前台运行效果如图12-7所示。

 

12-7显示指南针读数的界面

布局好前台界面后,接下来介绍如何从指南针传感器获取读数。首先在后台定义几个全局变量并在构造方法中初始化,以便在后续代码中使用。代码如下所示:

//定义全局变量

private Compass compass;

private uint desiredReportInterval;

public MainPage()

{

    this.InitializeComponent();

    //获取对指南针对象的引用

    compass = Compass.GetDefault();

    if (compass != null)

    {

        uint minReportInterval = compass.MinimumReportInterval;

        desiredReportInterval = minReportInterval > 16 ? minReportInterval : 16;

        CloseButton.IsEnabled = false;

    }

    else

    {

        InfoText.Text = "未发现指南针设备";

    }

}

在上面的代码中,使用Compass.GetDefault方法获得指南针传感器的引用对象compass,如果compass对象为空,在前台界面提示“未发现指南针设备”。

定义完全局变量后,接下来对“获取读数”按钮添加GetData_Click事件处理方法,单击这个按钮以启动指南针读数捕获。代码如下所示:

private void GetData_Click(object sender, RoutedEventArgs e)

{

    if (compass != null)

    {

       compass.ReportInterval = desiredReportInterval;

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

        GetDataButton.IsEnabled = false;

        CloseButton.IsEnabled = true;

    }

    else

    {

        InfoText.Text = "未发现指南针设备";

    }

}

在上面的事件处理程序中,使用了compass对象ReportInterval属性设置指南针的报告间隔,报告间隔会影响改变灵敏度,可参照表12-4选择合适的报告间隔。接着为compass对象的ReadingChanged事件添加事件处理方法GetChangedData,当指南针传感器驱动程序捕获到设备的转动动作时,会触发ReadingChanged事件进而执行GetChangedData方法。

12-4指南针当前报告间隔与灵敏度的关系

当前报告间隔(毫秒)

改变灵敏度(角度)

1 ms ~ 16 ms

0.01 °

17 ms ~ 32 ms

0.02 °

>= 33 ms

0.05 °

接下来介绍上面调用的GetChangedData 事件处理方法,这个方法异步检索加指南针传感器改变后的读数,然后将读数显示在应用程序前台界面中。代码如下所示:

async private void GetChangedData (object sender, CompassReadingChangedEventArgs e)

{

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>

    {

       //获得reading对象以便读取指南针读数

        CompassReading reading = e.Reading;

        //显示指南针读数

ScenarioOutput_MagneticNorth.Text = String.Format("{0,5:0.00}", reading.HeadingMagneticNorth);

    });

}

在上面的方法中,首先从参数e中获得CompassReading类型的对象reading,根据reading对象的HeadingMagneticNorth属性获取设备方向与地磁场北极之间的角度,将它显示在ScenarioOutput_MagneticNorth控件中。为了避免UI线程的阻塞,使用调度器DispatcherRunAsync方法异步实现上述过程。

为“停止”按钮添加单击事件处理方法CloseData_Click(),当单击此按钮时停止指南针数据捕获,CloseData_Click方法的代码如下所示:

private void CloseData_Click(object sender, RoutedEventArgs e)

{

    if (compass != null)

    {

        compass.ReadingChanged -= new TypedEventHandler<Compass, CompassReadingChangedEventArgs>(GetChangedData);

        GetDataButton.IsEnabled = true;

        CloseButton.IsEnabled = false;

    }

    else

    {

        InfoText.Text = "关闭指南针传感器读数失败";

    }

}

在之前介绍获取指南针数据时,通过为compass对象的ReadingChanged事件添加了一个GetChangedData方法来捕获指南针传感器改变时的数据,在上面的CloseData_Click事件方法中只是简单的将此事件处理方法移除掉,这样便可以停止传感器数据的捕获。

启动调试,单击“获取读数”按钮后,界面上显示当前设备指南针设备偏离磁北方向的角度信息。程序运行效果如图12-8所示。

 

12-8获取指南针数据的效果图

Compass类同样有一个GetCurrentReading方法,该方法能获得当前指南针读数,返回值类型为CompassReading,参照主动获取陀螺仪读数的部分,也可以使用指南针传感器每隔一段时间主动获取一次当前设备指南针读数。

注:本文选自机械工业出版社3月出品的《Windows 8 应用开发权威指南》第12章 传感器

另外:为在4月27日举办的微软云体验营免费活动做一下宣传。

转载于:https://www.cnblogs.com/finehappy/archive/2013/04/16/3023656.html

你可能感兴趣的文章
[转]c++类的大小
查看>>
查看ORACLE 数据库及表信息
查看>>
Beta 冲刺 (4/7)
查看>>
bzoj 5252: [2018多省省队联测]林克卡特树
查看>>
Mybatis缓存
查看>>
使用mysql(6部曲)
查看>>
leetcode 217—Contains Duplicate
查看>>
Vue基础知识之组件及组件之间的数据传递(五)
查看>>
https 学习笔记三
查看>>
Biopython 安装使用
查看>>
20155228 2016-2017-2 《Java程序设计》第10周学习总结
查看>>
QT1.1-与Opencv的hello world
查看>>
无意间把你的个人资料当圣诞礼物,送给了网络犯罪份子吗?
查看>>
HDU 4920(杭电多校训练#5 1010 题) Matrix multiplication(不知道该挂个什么帽子。。。)...
查看>>
服务器端配置
查看>>
变态跳青蛙
查看>>
SVN版本控制服务
查看>>
Luogu P4342 Polygon 题解报告
查看>>
RHEL 6.5----iscsi多路径存储
查看>>
两侧跟随广告
查看>>