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

來源:互聯網
上載者:User

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

昨天,我們討論了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日中介紹)類比資料而無需真實裝置。實際上你無法控制這個動作,它只能給你產生隨機資料。安裝起來非常簡單,而且相比於因為沒有真實的手機而不能開發來說十分地高效。MSDN的這個網站中有一個非常好的演練:http://bit.ly/bdeaft。

accelKit

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

  1. 它允許你真正地類比動作。
  2. 它利用了增強現實,人。這是一個了不起的技術應用。

來看看這些程式碼範例,來這裡下載附加的庫: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

 

如果大家喜歡我的文章,請點擊“推薦”,謝謝!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.