31天學會Windows Phone 7開發:加速感應器
上一篇,我們討論了Windows Phone的軟鍵盤。本文,來談談基于硬件的加速感應器以及如何利用它提供的信息。
什么是加速感應器?
目前缺乏一個更好的定義,Windows Phone設備中的加速度感應器是用來度量3個坐標軸加速度的裝置,這里說的加速度是相對于自由落體加速度的。除了一個時間戳之外,值都是用重力值(G)表示的(1G = 9.81 m/s2)。這意味著如果將電話正面朝上平放在一個絕對的平面上,Z軸應該為-1.0,其他兩個軸的數據為0。下面的圖例演示了不同的值(感謝的來自于WindowsTeamBlog的圖片):
如何從WP7的加速感應器中獲取數據?
幸好,這非常簡單。復雜的是我們需要管理一些線程,但其實也很簡單。下面是我們所要做的:
1.初始化一個Accelerometer對象。
2.創建一個ReadingChanged()事件處理程序來監視數據的變化。
3.將事件中的結果傳回我們的頁面線程(這個事件是在另一個線程中觸發的)。
4.在程序中使用這些數據。
這是我這個例子中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日中介紹)模擬數據而無需真實設備。實際上你無法控制這個動作,它只能給你產生隨機數據。安裝起來非常簡單,而且相比于因為沒有真實的手機而不能開發來說十分地高效。
accelKit
這個可能是最酷的選擇了。它利用攝像頭和增強現實,允許你移動手機的打印圖就像在真實世界中移動它一樣。它是如此的酷以至于使我神魂顛倒,有兩點原因:
1.它允許你真正地模擬動作。
2.它利用了增強現實,人。這是一個了不起的技術應用。
WiimoteLib
這個庫不僅僅能用于Windows Phone模擬器,不過它確實可以為我們的目的非常好的工作。故事是這樣的:如果你有一個任天堂的Wii,你可以用控制器(一個Wii遙控器)來生成你的加速感應器數據。
Windows Mobile Unified Sensor API
是的,就是“Windows Mobile”。這是在某些類型的Windows Mobile 6.x 設備上與加速感應器交互的方式。這篇文章描述了一種利用這種技術在Windows Phone上開發的方法。他們好像沒有提供代碼示例,但看起來非常簡單。
下載代碼示例
原作者:Jeff Blankenburg 譯者:金山崟霸
中文來源:http://www.cnblogs.com/porscheyin/archive/2010/12/22/1914215.html
英文來源:http://www.jeffblankenburg.com/2010/10/11/31-days-of-windows-phone-day-11-accelerometer/
【編輯推薦】