本文是“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");
}
}
}
模擬器不能類比加速感應器的資料
是的。如果你下載了本文最後的代碼,肯定會納悶為什麼Z軸資料總是-1呢,這是因為模擬器認為它是在平面上的。它沒有(有效)方法來類比加速感應器的資料。但是有一些聰明人找到了讓這成為現實的方法。本篇文章剩下的部分讓我很為難。我很想給每個模擬器解決方案寫一個例子,但是還有這麼多好的方法來類比加速感應器資料,我認為讓你們知道這些比僅僅寫程式碼範例要好。這有很多建議供你去實驗(每個網站都提供了程式碼範例):
Reactive Extensions
Reactive Extensions是一個架構允許你為加速感應器(還有位置服務,我會在第13日中介紹)類比資料而無需真實裝置。實際上你無法控制這個動作,它只能給你產生隨機資料。安裝起來非常簡單,而且相比於因為沒有真實的手機而不能開發來說十分地高效。MSDN的這個網站中有一個非常好的演練:http://bit.ly/bdeaft。
accelKit
這個可能是最酷的選擇了。它利用網路攝影機和增強現實,允許你移動手機的列印圖就像在真實世界中移動它一樣。它是如此的酷以至於使我神魂顛倒,有兩點原因:
- 它允許你真正地類比動作。
- 它利用了增強現實,人。這是一個了不起的技術應用。
來看看這些程式碼範例,來這裡下載附加的庫:http://bit.ly/9TfqaSn
WiimoteLib
這個庫不僅僅能用於Windows Phone模擬器,不過它確實可以為我們的目的非常好的工作。故事是這樣的:如果你有一個任天堂的Wii,你可以用控制器(一個Wii遙控器)來產生你的加速感應器資料。Brian Peek是將這些內容整合在這個小Managed 程式碼庫中的開發人員,如果你想實現的話可以到他的網站擷取相關資訊!http://bit.ly/aUdEEW
Windows Mobile Unified Sensor API
是的,就是“Windows Mobile”。這是在某些類型的Windows Mobile 6.x 裝置上與加速感應器互動的方式。這篇文章描述了一種利用這種技術在Windows Phone上開發的方法。他們好像沒有提供程式碼範例,但看起來非常簡單:http://bit.ly/crHbW9
下載程式碼範例
記住上述所有的解決方案都是暫時的。直到拿到裝置之前這些都是在“偽造”加速感應器的資料。沒有什麼能替代在真實裝置上運行你的代碼。如果你沒有機會這麼做,請聯絡我。我來看看能為你在手機面前做什麼,即使只是幾小時。
原文地址:http://www.jeffblankenburg.com/post/31-Days-of-Windows-Phone-7c-Day-11-Accelerometer.aspx
如果大家喜歡我的文章,請點擊“推薦”,謝謝!