31天學會Windows Phone 7開發(fā):加速感應(yīng)器
上一篇,我們討論了Windows Phone的軟鍵盤。本文,來談?wù)劵谟布募铀俑袘?yīng)器以及如何利用它提供的信息。
什么是加速感應(yīng)器?
目前缺乏一個更好的定義,Windows Phone設(shè)備中的加速度感應(yīng)器是用來度量3個坐標軸加速度的裝置,這里說的加速度是相對于自由落體加速度的。除了一個時間戳之外,值都是用重力值(G)表示的(1G = 9.81 m/s2)。這意味著如果將電話正面朝上平放在一個絕對的平面上,Z軸應(yīng)該為-1.0,其他兩個軸的數(shù)據(jù)為0。下面的圖例演示了不同的值(感謝的來自于WindowsTeamBlog的圖片):
如何從WP7的加速感應(yīng)器中獲取數(shù)據(jù)?
幸好,這非常簡單。復雜的是我們需要管理一些線程,但其實也很簡單。下面是我們所要做的:
1.初始化一個Accelerometer對象。
2.創(chuàng)建一個ReadingChanged()事件處理程序來監(jiān)視數(shù)據(jù)的變化。
3.將事件中的結(jié)果傳回我們的頁面線程(這個事件是在另一個線程中觸發(fā)的)。
4.在程序中使用這些數(shù)據(jù)。
這是我這個例子中MainPage.xaml.cs的全部內(nèi)容。你會看到我在MainPage.xaml文件中創(chuàng)建了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");
- }
- }
- }
模擬器不能模擬加速感應(yīng)器的數(shù)據(jù)
是的。如果你下載了本文***的代碼,肯定會納悶為什么Z軸數(shù)據(jù)總是-1呢,這是因為模擬器認為它是在平面上的。它沒有(有效的)方法來模擬加速感應(yīng)器的數(shù)據(jù)。但是有一些聰明人找到了讓這成為現(xiàn)實的方法。本篇文章剩下的部分讓我很為難。我很想給每個模擬器解決方案寫一個例子,但是還有這么多好的方法來模擬加速感應(yīng)器數(shù)據(jù),我認為讓你們知道這些比僅僅寫代碼示例要好。這有很多建議供你去實驗(每個站點都提供了代碼示例):
Reactive Extensions
Reactive Extensions是一個框架允許你為加速感應(yīng)器(還有位置服務(wù),我會在第13日中介紹)模擬數(shù)據(jù)而無需真實設(shè)備。實際上你無法控制這個動作,它只能給你產(chǎn)生隨機數(shù)據(jù)。安裝起來非常簡單,而且相比于因為沒有真實的手機而不能開發(fā)來說十分地高效。
accelKit
這個可能是最酷的選擇了。它利用攝像頭和增強現(xiàn)實,允許你移動手機的打印圖就像在真實世界中移動它一樣。它是如此的酷以至于使我神魂顛倒,有兩點原因:
1.它允許你真正地模擬動作。
2.它利用了增強現(xiàn)實,人。這是一個了不起的技術(shù)應(yīng)用。
WiimoteLib
這個庫不僅僅能用于Windows Phone模擬器,不過它確實可以為我們的目的非常好的工作。故事是這樣的:如果你有一個任天堂的Wii,你可以用控制器(一個Wii遙控器)來生成你的加速感應(yīng)器數(shù)據(jù)。
Windows Mobile Unified Sensor API
是的,就是“Windows Mobile”。這是在某些類型的Windows Mobile 6.x 設(shè)備上與加速感應(yīng)器交互的方式。這篇文章描述了一種利用這種技術(shù)在Windows Phone上開發(fā)的方法。他們好像沒有提供代碼示例,但看起來非常簡單。
下載代碼示例
原作者: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/
【編輯推薦】