Aplicatie Wi7

download Aplicatie Wi7

of 7

Transcript of Aplicatie Wi7

  • 8/16/2019 Aplicatie Wi7

    1/7

    Acceleromtrul in Windows Phone 7

  • 8/16/2019 Aplicatie Wi7

    2/7

    Accelerometrul

      Telefoanele Windows conţin un accelerometru, un dispozitiv hardware mic, care înesenţă, conform fizicii elementar ă, ne spune cu cât este propor ţională acceleraţia.

    Accelerometrul r ăspunde la for ţa de gravitaţie, iar accelerometrul ne poate spune prinaplicație direcţia Pământului în raport cu telefonul.  O simulare a unui nivel de balon este o aplicaţie care face uz de accelerometru, dar accelerometrul poate oferi, de asemenea, o bază pentru animaţii interactive.  Accelerometru, de asemenea, r ăspunde la mişcări bruşte, cum ar fi shake-uri sau jerks,utile pentru simulări de zaruri sau alt tip de activitate random.  Este convenabil să reprezinte ieşirea accelerometrul ca un vector in spatiultridimensional.  Vectori sunt scrisi în caractere aldine, astfel încât vectorul acceleraţie poate fisimbolizat ca ( x, y, z ). XNA defineşte un tip de vector tridimensional , iar Silverlight nu.  În timp ce un punct tridimensional (x, y, z) indică o anumită locaţie, în spaţiu,

    vectorul (x,y, z) încapsulează în schimb, o direcţie şi o magnitudine.  Un punct şi un vector sunt legate de: direcţia vectorului (x, y, z) care este direcţiadin punctul (0, 0, 0) pentru punctul (x, y, z). Dar vector (x, y, z) nu este definit cu (0, 0, 0)la (x, y, z)., este doar direcţia acelei liniei.  Magnitudinea pentru vectorul (x, y, z) este calculabilă la forma tridimensională prinTeorema lui Pitagora:

      Pentru a lucra cu accelerometru, telefonul este ca definit în cele trei coordonatetridimensionale . Indiferent de modul în care telefonul este orientat, axa Y pozitivă este în punctele din partea de sus a telefonului (partea de jos se consider ă partea cu butoane), iar  punctele pozitive ale axei X sunt de la stânga la dreapta.

  • 8/16/2019 Aplicatie Wi7

    3/7

      Acest sistem de coordonate r ămâne fixat în raport cu telefonul, indiferent cum se vaţine telefonul, şi indiferent de orientarea oricăror alte programe care rulează pe telefon.Accelerometrul este baza pentru efectuarea modificărilor de orientare ale aplicațieiWindows Phone 7.

      Atunci când telefonul este în continuare îndreptat cu punctele vectoruluiaccelerometrului spre pământ, magnitudinea este 1, adica 1 g, care este for ţagravitaţională pe suprafaţa pământului. Atunci când telefonul este în poziţie verticală,acceleratia are vectorul (0, -1, 0), care este, drept în jos.  Rotind cu 90 ° telefonul , în sens opus acelor de ceasornic ( spre stânga) , vectorulacceleraţie devine (-1, 0, 0), iar la o rotire cu 180° acesta devine (0, 1, 0), şi apoi la 90 °contrar sensului acelor de ceasornic se aduce în orientare dreapta şi o valoare deaccelerometru (1, 0, 0). Dacă telefonul este lăsat pe un birou, cu ecranul îndreptat în sus ,vectorul acceleraţie este (0, 0, -1).  Pentru un telefon magnitudinea poate varia în funcţie de câteva puncte procentuale,cu orientări diferite.

      Când telefonul cu Windows 7, este îndreptat spre Lună , mărimile vectoriale deaccelerare sunt de aproximativ 0,17, dar este limitată recepţia telefonului mobil.  Vectorul acceleraţie poate indica și în alte direcţii (şi magnitudinea poate deveni maimare sau mai mică), atunci când telefonul se accelerează, poate câștiga sau pierde viteză.  Dacă telefonul este în cădere liber ă, magnitudinea vectorului accelerometrului vamerge, teoretic, în jos la zero.  Pentru a utiliza accelerometru, este nevoie de o referinţă la biblioteca Microsoft.Devices.Sensors, şi se folosește o directivă pentru spaţiul de nume Microsoft.Devices.Sensors. În WMAppManifest.xml avem nevoie de:

      - prevăzut în mod implicit.

      În program se va crea o instanţă a clasei Accelerometer , și se va stabili o rutină detratare eveniment pentru evenimentul ReadingChanging  şi se apelează   Start .  În proiectul numit SilverlightAccelerometer, se afişează  citirea curentă în grila deconţinut. Un TextBlock  este definită în fişierul XAML de mai jos:

    Silverlight Project: SilverlightAccelerometer File: MainPage.xaml (excerpt)

         

      Acesta este un program care va afisa vectorul accelerometru pe toată durata de viaţă,astfel încât creează clasa Accelerometer , în constructor şi solicită Start:

    Silverlight Project: SilverlightAccelerometer File: MainPage.xaml.cs (excerpt)

  • 8/16/2019 Aplicatie Wi7

    4/7

      public MainPage()  {  InitializeComponent();  Accelerometer acc = new Accelerometer();  acc.ReadingChanged += OnAccelerometerReadingChanged;

      try  {  acc.Start();  }  catch (Exception exc)  {  txtblk.Text = exc.Message;  }  }

      Prin documentaţie se avertizează că se poate aștepta o excepție Start, astfel încât

     programul protejează faţă de această eventualitate. Accelerometrul suportă , de asemenea,Stop şi elimina metode, dar acest program nu face uz de ele.  O proprietate importantă, de asemenea disponibilă, este ceea care ne spune dacăaccelerometrul este disponibil şi ceea ce face în acel moment.  Eveniment ReadingChanged  este însoţit de evenimentul argumentului AccelerometerReadingEventArgs. Obiectul are proprietăţi numite X, Y, Z de tip doubleşi TimeStamp de tip DateTimeOffset . În programul SilverlightAccelerometer, se vor formata aceste informaţii într-un şir de caractere şi vor fi setate la proprietatea Text dinTextBlock .  Tratare a evenimentului (în acest caz OnAccelerometerReadingChanged ) esteapelată pe un fir de execuţie diferit, iar acest lucru înseamnă că trebuie să fie manipulateîntr-un mod special.  Toate elementele pentru interfaţa de utilizator, precum şi obiectele dintr-o aplicaţieSilverlight sunt create şi accesate într-un fir principal de execuție, numit firul de interfaţacu utilizatorul sau UI thread.  Aceste obiecte de interfață pentru utilizator nu sunt fire de siguranţă; acestea nu suntconstruite pentru a fi accesate simultan de mai multe fire. Din acest motiv, Silverlight nu permite accesarea unui obiect interfaţă utilizator de la un fir de UI thread..Acest lucruînseamnă că metoda de OnAccelerometerReadingChanged  nu poate accesa directelementul TextBlock  element pentru a seta, a stabili o nouă valoare de proprietate textuluisău: Text property.  Există o soluţie care implică o clasă Dispatcher   definit în spațiulSystem.Windows.Threading  . Prin această clasă se pot posta pentru fire non-UI, o listă deaşteptare în cazul în care acestea sunt executate mai târziu de către firul UI. Acest proceseste complex, dar, din perspectiva programării sunt ușoare deoarece apelează metodesimple.  Clasa DependencyObject  defineşte o proprietate Dispatcher , de tip Dispatcher  şimai multe clase Silverlight provin de la DependencyObject . Instanțele acestor clase pot fiaccesate de la fire non-UI , pentru că toate au proprietăţi de Dispatcher .

  • 8/16/2019 Aplicatie Wi7

    5/7

      Se poate folosi orice obiect Dispatcher  de la orice derivată DependencyObject createîn fir UI dumneavoastr ă. Acestea sunt toate la fel.  Clasa Dispatcher  defineşte o metoda numita checkAccess care returnează true  dacăse poate accesa un anumit obiect de interfaţă cu utilizatorul de la firul curent. MetodacheckAccess este un duplicat de DependencyObject  . Dacă un obiect nu poate fi accesat

    de la firul curent, Dispatcher ofer ă două versiuni ale unei metode, numită Invoke pe carele utilizează pentru a posta la firul UI.  Proiectul SilverlightAccelerometer implementează o versiune elaborată din punct devedere sintactic a codului.  Versiunea detaliată necesită un delegat şi o metodă definită în conformitate cu acesta.Delegatul şi metoda nu trebuie să aibă nici o valoare de return , dar ar fi multeargumente pentru aceste posturi. Pentru acest caz se va seta un string la proprietatea Text din TextBlock :

    Project: SilverlightAccelerometer File: MainPage.xaml.cs (excerpt)

      delegate void SetTextBlockTextDelegate(TextBlock txtblk, string text);  void SetTextBlockText(TextBlock txtblk, string text)  {  txtblk.Text = text;  }

    OnAccelerometerReadingChanged este responsabil pentru apelarea   SetTextBlockText LA prima utilizarea de CheckAccess se va vedea dacă se poate apela direct doar metodaSetTextBlockText   . Dacă acest lucru nu este posibil se apelează metoda BeginInvoke.Primul argument este o instanţiere a delegatului cu metoda SetTextBlockText , apoi esteurmat de toate argumentele pe care le prevede SetTextBlockText  :

    Project: SilverlightAccelerometer File: MainPage.xaml.cs (excerpt)

      void OnAccelerometerReadingChanged(object sender,  AccelerometerReadingEventArgs  args)  {  string str = String.Format("X = {0:F2}\n" +  "Y = {1:F2}\n" +  "Z = {2:F2}\n\n" +  "Magnitude = {3:F2}\n\n" +  "{4}",  args.X, args.Y, args.Z,  Math.Sqrt(args.X * args.X + args.Y * args.Y +  args.Z * args.Z),  args.Timestamp);  if (txtblk.CheckAccess())  {

  • 8/16/2019 Aplicatie Wi7

    6/7

      SetTextBlockText(txtblk, str);  }  else  {  txtblk.Dispatcher.BeginInvoke(new

      SetTextBlockTextDelegate(SetTextBlockText),  txtblk, str);  }  }

      Este nevoie pentru cod să ocolească  fire ce necesită o metodă suplimentar ă şi undelegat. Metoda BeginInvoke are o supraîncărcare, care acceptă un delegat Action  caredefineşte o metoda care nu are nici o valoare de return şi nici argumente. Se poate crea ometodă anonimă  în apelul BeginInvoke.Codul complet după crearea obiectului stringarata astfel:

    if (txtblk.CheckAccess()){  txtblk.Text = str;}else{  txtblk.Dispatcher.BeginInvoke(delegate()  {  txtblk.Text = str;  });}

      Metoda anonimă începe cu cuvinte cheie delegat şi se încheie cu corpul metodei.Paranteze goale după cuvinte cheie delegat nu sunt necesare.  Această metodă anonimă poate fi, de asemenea, definit printr-o expresie lambda:

    if (txtblk.CheckAccess()){  txtblk.Text = str;}  else  {  txtblk.Dispatcher.BeginInvoke(() =>  {  txtblk.Text = str;  });  }

      Codul duplicat, care stabileşte proprietatea Text din TextBlock  este de dorit, ca încazul în care a implicat mai mult decât o declaraţie, nu este nevoie pentru a apela

  • 8/16/2019 Aplicatie Wi7

    7/7