Windows Phone 7 開發 31 日談——第11日:加速感應器

l_serein發表於2012-11-02

By Jeff Blankenburg

本文是Windows Phone 7 開發 31 日談” 系列的第11日。

 

昨天,我們討論了Windows Phone的軟鍵盤。今天,來談談基於硬體的加速感應器以及如何利用它提供的資訊。

什麼是加速感應器?

目前缺乏一個更好的定義,Windows Phone裝置中的加速度感應器是用來度量3個座標軸加速度的裝置,這裡說的加速度是相對於自由落體加速度的。除了一個時間戳之外,值都是用重力值(G)表示的(1G = 9.81 m/s2 )。這意味著如果將電話正面朝上平放在一個絕對的平面上,Z軸應該為-1.0,其他兩個軸的資料為0。下面的圖例演示了不同的值(感謝的來自於WindowsTeamBlog 的圖片):

clip_image001

如何在WP7的加速感應器中獲取資料?

幸好,這非常簡單。複雜的是我們需要管理一些執行緒,但其實也很簡單。下面是我們所要做的:

  1. 初始化一個Accelerometer物件。
  2. 建立一個ReadingChanged()事件處理程式來監視資料的變化。
  3. 將事件中的結果傳回我們的頁面執行緒(這個事件是在另一個執行緒中觸發的)。
  4. 在程式中使用這些資料。

這是我這個例子中MainPage.xaml.cs的全部內容。你會看到我在MainPage.xaml檔案中建立了3個TextBlock(XText, YText和ZText) ,所以我可以在螢幕中顯示這些值。同樣還可以看到我新增了一個Microsoft.Devices.Sensors名稱空間的引用來訪問Accelerometer類。

[c-sharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Windows;  
  6. using System.Windows.Controls;  
  7. using System.Windows.Documents;  
  8. using System.Windows.Input;  
  9. using System.Windows.Media;  
  10. using System.Windows.Media.Animation;  
  11. using System.Windows.Shapes;  
  12. using Microsoft.Phone.Controls;  
  13. using Microsoft.Devices.Sensors;  
  14. namespace Day11_Accelerometer  
  15. {  
  16.     public partial class MainPage : PhoneApplicationPage  
  17.     {  
  18.         Accelerometer acc = new Accelerometer();  
  19.         // Constructor  
  20.         public MainPage()  
  21.         {  
  22.             InitializeComponent();  
  23.             acc.ReadingChanged += new EventHandler(acc_ReadingChanged);  
  24.             acc.Start();  
  25.         }  
  26.         void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)  
  27.         {  
  28.             Deployment.Current.Dispatcher.BeginInvoke(() => ThreadSafeAccelerometerChanged(e));  
  29.         }  
  30.         void ThreadSafeAccelerometerChanged(AccelerometerReadingEventArgs e)  
  31.         {  
  32.             XText.Text = e.X.ToString("0.000");  
  33.             YText.Text = e.Y.ToString("0.000");  
  34.             ZText.Text = e.Z.ToString("0.000");  
  35.         }  
  36.     }  
  37. }  

嗯,模擬器不能模擬加速感應器的資料

是的。如果你下載了本文最後的程式碼,肯定會納悶為什麼Z軸資料總是-1呢,這是因為模擬器認為它是在平面上的。它沒有(有效的)方法來模擬 加速感應器的資料。但是有一些聰明人找到了讓這成為現實的方法。本篇文章剩下的部分讓我很為難。我很想給每個模擬器解決方案寫一個例子,但是還有這麼多好的方法來模擬加速感應器資料,我認為讓你們知道這些比僅僅寫程式碼示例要好。這有很多建議供你去實驗(每個站點都提供了程式碼示例):

Reactive Extensions

Reactive Extensions是一個框架允許你為加速感應器(還有位置服務,我會在第13日中介紹)模擬資料而無需真實裝置。實際上你無法控制這個動作,它只能給你產生隨機資料。安裝起來非常簡單,而且相比於因為沒有真實的手機而不能開發來說十分地高效。MSDN的這個站點中有一個非常好的演練:http://bit.ly/bdeaft 。

accelKit

這個可能是最酷的選擇了。它利用攝像頭和擴增實境,允許你移動手機的列印圖就像在真實世界中移動它一樣。它是如此的酷以至於使我神魂顛倒,有兩點原因:

  1. 它允許你真正地模擬動作。
  2. 它利用了擴增實境,人。這是一個了不起的技術應用。

來看看這些程式碼示例,來這裡下載附加的庫:http://bit.ly/9TfqaSn

WiimoteLib

這個庫不僅僅能用於Windows Phone模擬器,不過它確實可以為我們的目的非常好的工作。故事是這樣的:如果你有一個任天堂的Wii,你可以用控制器(一個Wii遙控器)來生成你的加速感應器資料。Brian Peek是將這些內容整合在這個小託管程式碼庫中的開發人員,如果你想實現的話可以到他的站點獲取相關資訊!http://bit.ly/aUdEEW

Windows Mobile Unified Sensor API

是的,就是“Windows Mobile”。這是在某些型別的Windows Mobile 6.x 裝置上與加速感應器互動的方式。這篇文章描述了一種利用這種技術在Windows Phone上開發的方法。他們好像沒有提供程式碼示例,但看起來非常簡單:http://bit.ly/crHbW9

下載程式碼示例

記住上述所有的解決方案都是暫時的。直到拿到裝置之前這些都是在“偽造”加速感應器的資料。沒有什麼能替代在真實裝置上執行你的程式碼。如果你沒有機會這麼做,請聯絡我 。我來看看能為你在手機面前做什麼,即使只是幾小時。

clip_image002

原文地址:http://www.jeffblankenburg.com/post/31-Days-of-Windows-Phone-7c-Day-11-Accelerometer.aspx

相關文章