Senzori și servicii
Scopul cursului este de a învăța cum să lucrați cu coordonatele, un accelerometru. hărți și alte servicii și senzori.
Dispozitivul Windows Phone 7 trebuie să aibă o serie de capabilități hardware - numite uneori senzori - și să furnizeze anumite servicii software, eventual cu suport hardware. Luați în considerare acele dintre ele care sunt de interes pentru dezvoltatori:
accelerometru
Este convenabil să se reprezinte datele de ieșire ale accelerometrului sub forma unui vector tridimensional. De obicei, vectorii sunt scrise cu caractere aldine, deci vectorul de accelerare poate fi scris ca:. În XNA există un tip de vector tridimensional. Silverlight nu are.
În timp ce trei coordonate determină cu precizie un punct în spațiu, vectorul denotă direcția și magnitudinea. Evident, punctul și vectorul sunt interdependente. Direcția vectorului este o rază de la un punct la altul. Dar vectorul nu este deloc o linie. conectarea și. Aceasta este direcția acestui segment.
Pentru a calcula modulul unui vector, folosim forma tridimensională a teoremei pitagoreene:
Fig. 8.1. Sistem tridimensional de coordonate
Acesta este un sistem tradițional tridimensional de coordonate. Același lucru este folosit la crearea graficii 3D pe XNA. Se numește sistemul de coordonate potrivit. Așezați degetul arătător al mâinii drepte de-a lungul direcției pozitive, degetul mijlociu - de-a lungul direcției pozitive, iar degetul mare va indica direcția pozitivă.
În caz de cădere liberă, modulul vectorului de accelerare, teoretic, ar trebui să tindă la zero.
Pentru a lucra cu accelerometrul, utilizați biblioteca Microsoft.Devices.Sensors și spațiul de nume Microsoft.Devices.Sensors. În fișierul WMAppManifest.xml, trebuie să specificați:
Acesta este setat implicit.
Aplicația creează o instanță a clasei Accelerometer, stabilește modulul handler de evenimente pentru ReadingChanging și apelează metoda Start.
Luați în considerare proiectul SilverlightAccelerometer. proiect. care oferă pur și simplu o afișare a citirilor curente. TextBlock-ul centrat este descris în fișierul XAML.
Proiectul Silverlight: fișier SilverlightAccelerometer. Mainpage. xaml (fragment)
Pentru a adăuga biblioteca Microsoft.Devices.Sensors la proiect, aveți nevoie de:
- Faceți clic dreapta pe nodul SilverlightAccelerometer / Referințe din Solution Explorer și selectați Add Reference. În fila .NET a ferestrei care apare, selectați Microsoft.Devices.Sensors pentru a selecta bibliotecile și faceți clic pe OK;
Fig. 8.2. Adăugarea Bibliotecii Microsoft.Devices.Sensors
Această aplicație va oferi afișarea vectorului accelerometrului pe întreaga durată de execuție a acestuia, astfel încât crearea constructorului din clasa Accelerometru și apelul la metoda de pornire apar în constructor:
Proiectul Silverlight: fișier SilverlightAccelerometer. Mainpage. xaml .cs (fragment)
Documentația avertizează că apelul de inițiere poate duce la o excepție, astfel încât aplicația se protejează de aceasta. Clasa Accelerometer sprijină, de asemenea, metodele Stop și Dispose, dar acestea nu sunt utilizate în acest program. Pentru a furniza informații despre disponibilitatea accelerometrului și a stării acestuia, este furnizată proprietatea statului.
Evenimentul ReadingChanged este furnizat de clasa de argument a evenimentului AccelerometerReadingEventArgs. Acest obiect are proprietăți, atât de tipul double, cât și de proprietatea TimeStamp de tip DateTimeOffset (Date-time offset). În aplicația SilverlightAccelerometer, sarcina handler-ului de eveniment este să formateze aceste date într-un șir și să le setați ca valoare a proprietății Text a obiectului TextBlock.
Prinde aici este faptul că manipulatorul de evenimente (în acest caz, OnAccelerometerReadingChanged) este chemat într-un alt fir de execuție. Aceasta înseamnă că trebuie tratată într-un mod special.
Un pic de teorie. Crearea și accesul la toate elementele și obiectele interfeței utilizator într-o aplicație pe Silverlight se efectuează în firul principal de execuție, adesea denumit un fir de interfață cu utilizatorul sau un fir de interfață utilizator. Aceste obiecte din UI nu sunt protejate de fir; acestea nu au acces simultan din mai multe fire. Prin urmare, Silverlight nu va permite accesul la obiectul interfeței utilizator dintr-un fir care nu este un flux UI.
Aceasta înseamnă că metoda OnAccelerometerReadingChanged nu poate accesa direct elementul TextBlock pentru a seta o nouă valoare pentru proprietatea Text.
Din fericire, spațiul de nume System.Windows.Threading descrie clasa Dispecer, care oferă o soluție la această problemă. Prin intermediul clasei Dispatcher, puteți direcționa lucrările dintr-un fir care nu este un fir UI la o coadă. care ulterior vor fi procesate de fluxul UI. Totul pare destul de confuz, dar din punctul de vedere al dezvoltatorului este destul de simplu, deoarece aceste sarcini iau forma unor apeluri de metode simple.
O instanță Dispatcher este deja disponibilă. Clasa DependencyObject descrie proprietatea Dispatcher a tipului Dispatcher. și de la DependencyObject moștenesc o mulțime de clase Silverlight. Cu instanțele tuturor acestor clase, puteți lucra din fire care nu sunt fire de UI, deoarece toate au proprietăți Dispatcher. Orice obiect Dispatcher poate fi folosit din orice clasă derivată de la DependencyObject creată în fluxul UI. Ele sunt la fel.
Clasa Dispatcher defineste metoda CheckAccess, care returneaza true. dacă firul curent are acces la un anumit obiect al interfeței utilizator. (Metoda CheckAccess este, de asemenea, duplicată de DependencyObject.) În cazurile în care accesul la un obiect din firul curent nu este posibil, Dispatcher oferă două versiuni ale metodei Invoke care trimit sarcini pentru fluxul UI.
Proiectul SilverlightAccelerometer implementează o versiune de cod care este detaliată în termeni de sintaxă.
Versiunea implementată necesită un delegat și o metodă corespunzătoare acestui delegat. Delegatul (și metoda) nu ar trebui să aibă o valoare de returnare, dar trebuie să aibă cât mai multe argumente pe cât va fi de ajuns pentru a-și termina treaba. În acest caz, această sarcină constă în atribuirea unui șir ca valoare a proprietății Text a obiectului TextBlock.
Proiect: fișier SilverlightAccelerometer. Mainpage. xaml .cs (fragment)
OnAccelerometerReadingChanged este responsabil pentru a apela SetTextBlockText (Set text text bloc). Mai întâi utilizează CheckAccess. Pentru a determina posibilitatea de a apela direct metoda SetTextBlockText. Dacă acest lucru nu este posibil, manipulatorul apelează metoda BeginInvoke. Primul său argument este o instanță a delegatului cu metoda SetTextBlockText. Acesta este urmat de toate argumentele SetTextBlockText necesare:
Proiect: fișier SilverlightAccelerometer. Mainpage. xaml .cs (fragment)
Aceasta nu este cea mai gravă opțiune, dar nevoia de a sari de la flux la flux a implicat utilizarea unei metode suplimentare și a delega.
Fig. 8.3. Rezultatul programului