【Windows Phone 8】加速計

  • 613
  • 0
  • 2013-11-25

【Windows Phone 8】加速計

前言:

 

這加速計的範例是小弟以前玩【Phone 7】看書時小小玩的一個範例,沒想到在【Phone 8】依然可行,

但是系統會警告accelerometer_ReadingChanged已過時在此版本不適用,

建議使用Microsoft.Devices.Sensors.SensorBase<TSensorsReading>.CurrentValueChanged事件。

 

參考【Windows Phone Mango 應用程式開發 使用Visual Studio】【高雪松】編著 【佳魁資訊】出版

 

實作:

 

在頁面中加入下列Xaml

 


<StackPanel>
                <StackPanel Orientation="Horizontal" >
                    <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="X:" VerticalAlignment="Top" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                    <TextBlock x:Name="TB_X" HorizontalAlignment="Left" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal" >
                    <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="Y:" VerticalAlignment="Top" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                    <TextBlock x:Name="TB_Y" HorizontalAlignment="Left" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal" >
                    <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="Z:" VerticalAlignment="Top" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                    <TextBlock x:Name="TB_Z" HorizontalAlignment="Left" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                </StackPanel>
                <TextBlock x:Name="T" HorizontalAlignment="Left" TextWrapping="Wrap" Text="" VerticalAlignment="Top" FontSize="{StaticResource PhoneFontSizeLarge}"/>
            </StackPanel>

 

Step-1 設定【全域】變數

說明:此變數是建立加速計存取權


Accelerometer accelerometer;

 

Step-2 設置啟動與關閉事件(測試方便啟動與關閉整合為一個AppBarButton)

註:這裡就不從建AppBarButton開始做起直接從事件內程式碼開始

說明:如沒有權限按下按鈕將權限開啟並建立accelerometer_ReadingChanged事件,

若以開啟權限按下按鈕則將關閉。

 


if (accelerometer == null)
            {
                accelerometer = new Accelerometer();
                accelerometer.ReadingChanged += accelerometer_ReadingChanged;
                try
                {
                    accelerometer.Start();
                    T.Text = "啟動";
                }
                catch
                {
                    T.Text = "失敗";
                }
            }
            else
            {

                try
                {
                    accelerometer.Stop();
                    T.Text = "關閉";
                    accelerometer = null;
                }
                catch
                {
                    T.Text = "失敗";
                }
            }

 

Step-3  accelerometer_ReadingChanged方法

說明:利用非同步的方式進行事件委派

 


void accelerometer_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
        {
            Deployment.Current.Dispatcher.BeginInvoke(()=>Show(e));
        }

Step-4 非同步委派方法

 


void Show(AccelerometerReadingEventArgs e)
        {
            if (accelerometer != null)
            {
                TB_X.Text = e.X.ToString("0.000");
                TB_Y.Text = e.Y.ToString("0.000");
                TB_Z.Text = e.Z.ToString("0.000");
            }
        }

 

 

執行結果:

 

Show