虽然减速计,指南针,陀螺仪和活动传感器等分歧的传感器前往分歧类型的数据,但它们运用类似的形式来陈述(反应)它们各自前往的数据。在接下来的几页中,你将学会怎么读取分歧传感器前往数据的技巧。我们引见了一些办法,你可依此来构建一些根本的示例使用顺序。传感器(Sensors)API的类和接口构成可以在 Windows.Devices.Sensors 定名空间中找到。
你会留意到,在Windows Phone 8 SDK中有两个自力的传感器API。在Microsoft.Devices.Sensors 中的API 曾是Windows Phone 7 SDK的一部分,并引入到了Windows Phone 8。另外一个传感器的API来自Windows 8 Runtime ,是Windows Phone与Windows 8操纵系总共享的。假如你计划的在Windows Phone和Windows 8的使用顺序之间同享代码,那末应当思索运用 Windows 8传感器的API。 Windows Phone 7的传感器API在我们的书中其实不触及。
固然减速计,罗盘,陀螺仪,重力感应传感器其实不同享一个配合的基类,但它们都有一些类似的属性,办法和事情。这些配合的成员描绘于表1。
成员 |
类型 |
描绘 |
GetCurrentReading | 办法 |
前往一个只读的工具,包括今朝可用的传感器数据。 |
GetDefault | 办法 |
前往一个传感器实例的静态结构办法。 |
MinimumReportInterval | 属性 |
只读的值,属性值指定的最小值,可以经过在ReportIntervalp属性来设置。 |
ReadingChanged | 事情 |
激发的事情,由以后读取数据发作变更触发。 |
ReportInterval | 属性 |
设置传感器读取新的数据的频率。每次设置工夫距离时GetCurrentReading 只改动一次并前往数据。 |
使用顺序经过挪用GetCurrentReading办法来读取以后传感器的前往。别的,使用顺序可以触发ReadingChanged事情接纳传感器的数据,只需传感器有新的数据。GetCurrentReading办法可以在传感器没有预备好时挪用,那末前往的值就为空。
留意:假如 ID_CAP_SENSORS 运用未在WMAppManifest.xml文件中设置装备摆设,GetDefault for的任何挪用将可招致额定的非法拜访(UnauthorizedAccessException)。
每一个传感器类中的都界说一个静态办法GetDefault。 GetDefault办法答应开发职员来决议传感器的硬件能否装置在特定的装备上和能否对该使用顺序可用。假如该传感器没有装置到该装备或对使用顺序不成用,GetDefault办法因为缺少传感器而前往空。
每一个传感器陈述的数据与 x、 y、 z 坐标系统由 Windows Phone 装备界说。该装备的坐标系统牢固到装备,并顺手机的挪动而挪动。X轴是指装备的左 --> 右,+X 指装备的右边。Y 轴指的装备的底部到顶部,+ y 指向顶部。Z 轴指装备的前面-->后面, + z 指装备的后面。图 1 所示即为手机的x,y,z轴的三视图。
图1 Windows Phone的x,y,z坐标系统
由传感器运用的坐标系统,其实不必定相适配与其他 API 所运用的坐标系。此中一个例子是由XAML运用的坐标系统。纵向形式中的XAML,+y轴指出挪动装备的底部,-y轴指向相反的标的目的。如今你应当清楚传感器所运用坐标舷?了,接下来将具体见绍怎么从传感器获得数据。
传感器经过 ReadingChanged 事情来树立一个事情驱动的交互模子。ReadingChanged 事情将一个事情参数类的实例发送到事情处置顺序,事情参数类的类型随传感器分歧而分歧。 减速度计将通报一个通报减速度计ReadingChanged事情参数,指南针将通报一个指南针ReadingChanged的事情参数等。
ReadingChanged 事情处置顺序经过后台线程来挪用。假如事情处置顺序更新用户界面,更新逻辑脚背被调剂到UI线程。下面的代码片断显示例子,处置历来自陀螺仪传感器的 ReadingChanged事情:
void sensor_ReadingChanged(object sender, GryometerReadingChangedEventArgs e) { GryometerReading reading = e. Reading; Dispatcher.BeginInvoke(() => { // add logic here to update the UI with data from the reading ... } }
书的第10章中我们构建的传感器示例使用顺序,没有运用ReadingChanged事情的。 取而代之,示例使用顺序样本运用GetCurrentReading 办法来取得数据。
if (compassSensor != null) { CompassReading reading = compassSensor.GetCurrentReading(); if (reading != null) { // add logic here to use the data from the reading ... } }
你将经过示例使用顺序的计时器滴答(timer tick)事情中来读取传感器数据 。 在实践演示之前,你需求创立一个新的项目并开发一个使用可以显示传感器的数据。
翻开 Visual Studio 并创立新的 Windows Phone 使用顺序定名为传感器。示例使用顺序将从重力、 指南针、 轴摇晃、 测斜仪和标的目的传感器中读取值。图2中所示的示例使用顺序显示一组的彩条为重力、 轴摇晃和 测斜仪中的数据。每一个组的酒吧显示传感器读数,x、 y 和 z 坐标。在屏幕的底部,该使用顺序显示一个legend和关于传感器的提醒信息,即来自标的目的传感器的读数。
为了简化使用顺序示例,您就会生成一个可重用的控件,答应您设置比例巨细和传感器的值。当属性比例巨细或值更改时,该控件应绘制响应的负数或正数控件栏,并显示带有标签的值。把持栏经过运用 Windows Phone 用户控件的模板项来完成,点击项目(Project) >> 中添加新菜单项(Add New Item Menu)。为新的项目栏的定名。以下所示为新控件的 XAML 标志。
表1 标志栏控件
图 3 栏控件与 2.0 的缩放值和以后值为-1.0。
<Grid x:Name="LayoutRoot"> <Grid.RowDefinitions> <RowDefinition Height="1*" /> #1 <RowDefinition Height="1*" /> #1 </Grid.RowDefinitions> <Rectangle x:Name="positiveBar" VerticalAlignment="Bottom" /> <Rectangle x:Name="negativeBar" Grid.Row="1" VerticalAlignment="Top" /> <TextBlock x:Name="label" VerticalAlignment="Center" #2 Grid.RowSpan="2" Text="0" TextAlignment="Center" /> #2 </Grid> #1 Divide control into two rows #2 Center label
网格划分红两个半 #1 且每一个包括一个矩形。第一个矩形显示正值,而另外一个表现负值。放在标签 #2 显示栏两头的显示值为 标签栏的值。图 10.3 演示控件栏的模样,此时缩放值设置=2.0 和以后值设置=1.0。
图3 控件栏的模样,此时缩放值=2.0 和以后值=1.0。注栏控件的页可认为矩形填充分歧的色彩。以下为添加新的属性 BarFill 到在Bar.xaml.cs 文件中的:
public Brush BarFill { get { return positiveBar.Fill; } set { positiveBar.Fill = value; negativeBar.Fill = value; } }
经过设置BarFill的属性来为画笔分派矩形栏值为正或负
注: 假如您需求创立可重用的 XAML 把持,BarFill 属性和其他依靠项的相干属性。该控件需求声布模板部件,并将供给作为默许模板的 XAML 标志。 << Silverlight 5 in Action >> 一书中有关于创立可重用 XAML 具体材料。
下一步你将创立设置的缩放值和栏值的属性。因为你不晓得值的范畴,你需求挪用方通知控件怎么缩放到适配矩形的高度值。假定您需求的栏来显示值 2 和 - 2之间,而Barcontrol 是 200 像素高。值2 将需求将正的栏值设为 100 像素高,而值为 -1 的话将需求负的栏值设为 50 像素高。下一个具体列表将引见怎么经过设置 ScaleandValue属性来盘算信息栏的高度。
private double scale; public double Scale { get { return scale; } set { scale = value; Update(); #1 } } private double barValue; public double Value { get { return barValue; } set { barValue = value; Update(); } } private void Update() { int height = (int)(barValue * scale); #2 positiveBar.Height = height > 0 ? height : 0; negativeBar.Height = height < 0 ? height * -1 : 0; #3 label.Text = barValue.ToString("0.0"); } #1 Recalculate when properties change #2 Calculate height of bar #3 Invert negative height
缩放范畴值和浮动属性经过前面的字段和容易的getter和setter来完成。在每一个属性外面可经过挪用Update办法#1来从头盘算矩形栏的高度并更新用户界面。Update办法内你经过缩放比例的范围和栏的值字段 #2 失掉的值就是应绘制在栏的像素值。假如盘算失掉的的高度值大于0,正的栏高度值将更新为新值。假如盘算的高度值小于零,你分派负的栏的高度值及盘算之前的值取负#3。最初,你可使用ToString办法来设置格局化的字符串离开该标签的Text属性。
如今,你有一个Tools栏控件,您可以创立示例使用的用户界面。 您需求添加一个XML定名空间到MainPage.xaml以便你可使用新的Tools栏控件:
xmlns:l="clr-namespace:Sensors"
你如今可使用在MainPage.XAML标志中运用把持栏。 你需求在MainPage为每一个传感器设置三个把持栏,一共有九个把持栏。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协定,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务