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