windows phone 加速計(5)

來源:互聯網
上載者:User

在windows phone 中存在著加速計,我們可以利用加速計獲得使用者手機的狀態,根據手機狀態調整我們的程式,這樣會更人性化;windows phone 加速計採用的是三軸座標定位即在三維空間中的座標,加速計在三維空間中的點(x,y,z)是向量的,包含大小和方向,方向就是從原點(0,0,0)到三維空間中的點(x,y,z),向量的大小則是畢達格斯定理(貌似是高中有學到過),公式為√a^2+b^2+c^2;加速計原理詳細見http://www.cnblogs.com/liuq0s/archive/2010/09/14/1825908.html

首先是命名空間的引用:

//引用
//Accelerometer類用到
using Microsoft.Devices.Sensors;
//Dispatcher類用到
using System.Windows.Threading;

 

在xaml檔案中定義一個textblock 用於顯示一個點的座標,向量的大小和時間戳記:

<TextBlock x:Name="txtCoordinates" Text="顯示三軸座標" HorizontalAlignment="Center" VerticalAlignment="Center"  Grid.Row="1"></TextBlock>

 隱藏代碼檔案如下:

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;//引用//Accelerometer類用到using Microsoft.Devices.Sensors;//Dispatcher類用到using System.Windows.Threading;namespace GetAccelerometerCoordinates{    public partial class MainPage : PhoneApplicationPage    {        // 建構函式        public MainPage()        {            InitializeComponent();            //執行個體化加速計--知識點①            Accelerometer acc = new Accelerometer();            //加速計值發生變化是發生--知識點②            acc.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChanged);            try            {                //開始擷取加速計資料                acc.Start();            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }                   }        //當加速計值改變時發生--知識點③        void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)        {            string str = "x:" + e.X + ";\nY:" + e.Y + ";\nZ:" + e.Z + ";\n向量大小:" + Math.Sqrt(e.Z * e.Z + e.Y * e.Y + e.X * e.X) + ";\n時間戳記:" + e.Timestamp;            //確定嗲用線程是否可以訪問此對象--知識點④            if (txtCoordinates.CheckAccess())            {                txtCoordinates.Text = str;            }            else            {                //線程中非同步實現txtCoordinates賦值--知識點⑤                txtCoordinates.Dispatcher.BeginInvoke(new SetTextDel(SetText), txtCoordinates, str);            }        }        //委託        delegate void SetTextDel(TextBlock txtCoordinates, string str);        //方法        void SetText(TextBlock txtCoordinates, string str)        {            txtCoordinates.Text = str;        }    }}

 知識點①:Accelerometer類提供了訪問加速計的訪問

   屬性:

   

State

加速計狀態,為枚舉類型,在使用start方法之前可先獲取加速計狀態,看加速計是否可用

CurrentValue

獲得加速計,羅盤,的相關數據,

IsDataValid

擷取感應器資料的有效性,true為有效,false為無效

IsSupported

應用程式是否支援加速計,支援則為 true;否則為
false

TimeBetweenUpdates

獲取CurrentValueChanged
事件之間的首選時間

  知識點②:ReadingChanged事件在windows phone os 7.1中已到期,建議使用CurrentValueChanged使用方法和ReadingChanged方法類似

  知識點③ :該事件中的傳遞的參數,通過該參數可以獲得在三維空間中的座標,並可根據座標值進行運算,如獲得向量值

  知識點④:CheckAccess方法表示是否可以訪問UI線程,如果可以我們可以直接賦值textblock,如果不可以就的跨線程操作

  知識點⑤:Dispatcher類用於管理線程工作項目隊列,其中BeginInvoke(Delegate, Object())方法用於線程上的指定參數數組以非同步方式執行指定委託,這裡定義的委託和方法參數一致

 

:此是在模擬器中的座標,在模擬器中的座標會一直是這樣,不會改變,可以在windows phone手機中獲得真是的數值

 小結:加速計是擷取外部資訊的裝置,除此之外windows phone還有定位服務, 個人理解手機在三維空間的中的座標,類似於對重力的一種分解,還望高手指點迷津

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.