在WP7中方向感應器的偵測(Accelermoter)

在目前新的手機上都配有方向感應器(或是稱加速度計?),很常見的用途是當你的手機改變方向的時候,畫面也可以隨著方向的變更進行自動的切換,這真是一個很優的功能;或是一些類似賽車等的小遊戲,甚至不需要方向鍵來操控方向,直接用偵測器來偵測手機擺動的方向,玩起來更有感覺;那麼在WP7中應該要怎麼去抓目前手機的方向出來呢?

在目前新的手機上都配有方向感應器(或是稱加速度計?),很常見的用途是當你的手機改變方向的時候,畫面也可以隨著方向的變更進行自動的切換,這真是一個很優的功能;或是一些類似賽車等的小遊戲,甚至不需要方向鍵來操控方向,直接用偵測器來偵測手機擺動的方向,玩起來更有感覺;那麼在WP7中應該要怎麼去抓目前手機的方向出來呢?
下面簡單的做個測試,首先要先引入命名空間

之後利用Accelerometer類別就可以偵測了,主要必須要處理ReadingChanged的事件,例如下面的方式

         {
                Sensor = new Accelerometer();
                Sensor.ReadingChanged += new EventHandler(Sensor_ReadingChanged);
                Sensor.Start();
                tbState.Text = "Accelermoter detect started";
         }
         catch (AccelerometerFailedException)
         {
                tbState.Text = "Start Acceleromter error";
         }
事件處理的程式碼部分大致會像是下面這樣子

        {
            this.Dispatcher.BeginInvoke(() => ReadingChanged(e));
        }

        void ReadingChanged(AccelerometerReadingEventArgs e)
        {
            tbData.Text = "X: " + e.X.ToString() + Environment.NewLine +
                          "Y: " + e.Y.ToString() + Environment.NewLine +
                          "Z: " + e.Z.ToString() + Environment.NewLine;
        }

上面這邊我將目前x,y,z軸的數值簡單的直接顯示在TextBloxk上面,而顯示的時候因為是該事件是引發在不同的執行緒上,所以必須要用委派的方式來更新UI,這部分要留意一下;是不是很簡單呢,要停止的時候也是相當簡單,例如下面的方式

            {
                if (Sensor != null)
                {
                    Sensor.Stop();
                    sender = null;
                    tbState.Text = "Accelermoter detect stoped";
                }
            }
            catch (AccelerometerFailedException)
            {
                tbState.Text = "Stop Acceleromter error";
            }

能夠抓到數值之後,就可以再做進一步的處理,例如滾動的球或是遊戲等等了,下一篇我們再來試試看讓element在畫面上移動吧 :) 下面這邊也有篇很棒的介紹文章,不要錯過了喔
Using the Accelerometer in Silverlight for Windows Phone