接下来的一段时间里面,我们将对“Windows 8 应用商店应用开发”中的传感器开发进行一个系列的讲解,传感器作为Windows 8 应用开发当中与以往技术开发相差比较大而很少被博友们谈论,但是他们确实移动应用开发当中最最重要的技术,本系列将会以如何使用为主要目标,而不是炫耀开发出多么漂亮的应用为目标进行讲解。大家可将这些传感器的使用方法集合到应用当中。今天是第一讲氛围光传感器取值。
氛围光传感器能检测设备周围的照明变化,这种传感器返回以勒克斯为照明单位的数据。根据氛围光传感器获得的数据能动态的改变屏幕的明亮程度,这样既可以节省电量有又能增加用户观看屏幕的舒适度。下面是通过一个示例程序介绍如何使用氛围光传感器响应设备环境光的变化。
新建一个名字为“LightSensorExample”的Windows应用商店的空白应用程序项目,在MainPage.xaml文件的Grid元素中添加如下代码。
<TextBlock Text="获取氛围光数据" Height="40" FontSize="20" Margin="40,14,1175,714"/>
<Button Name="GetDataButton" Content="获取" Click="GetData_Click" Margin="40,96,0,634"/>
<Button Name="Closebutton" Content="停止" Click="CloseData_Click" Margin="127,96,0,634" RenderTransformOrigin="0.797,0.421"/>
<TextBlock Text="数据" FontSize="18" Margin="40,59,1262,677"/>
<TextBlock x:Name="ScenarioOutput_LUX" Text="没有数据" FontSize="18" Margin="104,59,1175,677"/>
<TextBlock Name="InfoText" Height="40" Margin="40,162,1175,566" FontSize="18"/>
在上面的代码中,添加了用于显示氛围光数据的TextBlock控件和2个控制按钮,其中一个按钮用于启动氛围光数据的捕获,另一个按钮则用于停止数据捕获。
前台运行效果如图12-13所示。
图12-13 获取氛围光数据的界面
布局好前台界面后,接下来介绍如何实现后台逻辑功能。首先在后台定义几个全局变量并在构造方法中初始化。代码如下所示:
private LightSensor sensor;
private uint desiredReportInterval;
public MainPage()
{
this.InitializeComponent();
sensor = LightSensor.GetDefault();
if (sensor != null)
{
uint minReportInterval = sensor.MinimumReportInterval;
desiredReportInterval = minReportInterval > 16? minReportInterval : 16;
Closebutton.IsEnabled = false;
}
}
在上面的构造方法中,使用LightSensor.GetDefault方法获得氛围光传感器的引用对象sensor,然后设置“停止”按钮不可使用。
定义完全局变量后,接下来对“获取”按钮添加GetData_Click事件处理方法,单击这个按钮启动氛围光读数的捕获。具体代码如下所示:
private void GetData_Click(object sender, RoutedEventArgs e)
{
if(sensor!=null)
{
//注册ReadingChanged事件的处理程序
sensor.ReadingChanged += new TypedEventHandler<LightSensor, LightSensorReadingChangedEventArgs>(GetChangedData);
InfoText.Text = "开启设备";
Closebutton.IsEnabled = true;
GetDataButton.IsEnabled = false;
}
}
在上面的代码中,为sensor对象的ReadingChanged事件添加事件处理方法GetChangedData,当氛围光传感器驱动程序捕获到设备的氛围光发生变化时,会触发ReadingChanged事件进而执行GetChangedData方法。下面来介绍GetChangedData方法的实现过程。
在GetChangedData方法中,定义了获取氛围光传感器数据并将数据显示到前台界面的过程,具体代码如下所示:
async private void ReadingChanged(object sender, LightSensorReadingChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
//获得氛围光传感器的读数
LightSensorReading reading = e.Reading;
ScenarioOutput_LUX.Text = String.Format("{0,5:0.00}", reading.IlluminanceInLux);
});
}
在上面的方法中,首先从参数e中获得LightSensorReading类型的对象reading,根据reading对象的IlluminanceInLux属性获取设备氛围光的数据,将它显示在ScenarioOutput_LUX控件中。
为“停止”按钮添加单击事件处理方法CloseData_Click(),当单击此按钮时停止氛围光数据的捕获,CloseData_Click方法的代码如下所示:
private void CloseData_Click(object sender, RoutedEventArgs e)
{
if (sensor != null)
{
sensor.ReadingChanged -= new TypedEventHandler<LightSensor, LightSensorReadingChangedEventArgs>(GetChangedData);
InfoText.Text = "关闭设备";
Closebutton.IsEnabled = false;
GetDataButton.IsEnabled = true;
}
}
启动调试,单击名字为“获取”的按钮便开始获取氛围光传感器的读数,单击“停止”按钮停止数据捕获。需要注意的是,在测试本示例时应确保测试设备支持氛围光传感器。运行效果如图12-14所示。
图12-14 显示氛围光的界面
LightSensor类同样有一个GetCurrentReading方法,该方法能获得当前氛围光读数,返回值类型为LightSensorReading,参照主动获取陀螺仪读数的部分,也可以使用计时器每隔一段时间主动获取一次当前设备氛围光读数。
本文选自自机械工业出版社3月出品的《Windows 8 应用开发权威指南》第12章 传感器