本文是“Windows Phone 7 开发 31 日谈”系列的第11日。
昨天,我们讨论了Windows Phone的软键盘。今天,来谈谈基于硬件的加速感应器以及如何利用它提供的信息。
什么是加速感应器?
目前缺乏一个更好的定义,Windows Phone设备中的加速度感应器是用来度量3个坐标轴加速度的装置,这里说的加速度是相对于自由落体加速度的。除了一个时间戳之外,值都是用重力值(G)表示的(1G = 9.81 m/s2)。这意味着如果将电话正面朝上平放在一个绝对的平面上,Z轴应该为-1.0,其他两个轴的数据为0。下面的图例演示了不同的值(感谢的来自于WindowsTeamBlog的图片):
如何从WP7的加速感应器中获取数据?
幸好,这非常简单。复杂的是我们需要管理一些线程,但其实也很简单。下面是我们所要做的:
- 初始化一个Accelerometer对象。
- 创建一个ReadingChanged()事件处理程序来监视数据的变化。
- 将事件中的结果传回我们的页面线程(这个事件是在另一个线程中触发的)。
- 在程序中使用这些数据。
这是我这个例子中MainPage.xaml.cs的全部内容。你会看到我在MainPage.xaml文件中创建了3个TextBlock(XText, YText和ZText) ,所以我可以在屏幕中显示这些值。同样还可以看到我添加了一个Microsoft.Devices.Sensors名称空间的引用来访问Accelerometer类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Devices.Sensors;
namespace Day11_Accelerometer
{
public partial class MainPage : PhoneApplicationPage
{
Accelerometer acc = new Accelerometer();
// Constructor
public MainPage()
{
InitializeComponent();
acc.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChanged);
acc.Start();
}
void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
Deployment.Current.Dispatcher.BeginInvoke(() => ThreadSafeAccelerometerChanged(e));
}
void ThreadSafeAccelerometerChanged(AccelerometerReadingEventArgs e)
{
XText.Text = e.X.ToString("0.000");
YText.Text = e.Y.ToString("0.000");
ZText.Text = e.Z.ToString("0.000");
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Devices.Sensors;
namespace Day11_Accelerometer
{
public partial class MainPage : PhoneApplicationPage
{
Accelerometer acc = new Accelerometer();
// Constructor
public MainPage()
{
InitializeComponent();
acc.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChanged);
acc.Start();
}
void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
Deployment.Current.Dispatcher.BeginInvoke(() => ThreadSafeAccelerometerChanged(e));
}
void ThreadSafeAccelerometerChanged(AccelerometerReadingEventArgs e)
{
XText.Text = e.X.ToString("0.000");
YText.Text = e.Y.ToString("0.000");
ZText.Text = e.Z.ToString("0.000");
}
}
}