Sunteți pe pagina 1din 7

Acceleromtrul in Windows Phone 7

Accelerometrul
Telefoanele Windows conin un accelerometru, un dispozitiv hardware mic, care n
esen, conform fizicii elementar, ne spune cu ct este proporional acceleraia.
Accelerometrul rspunde la fora de gravitaie, iar accelerometrul ne poate spune prin
aplicaie direcia Pmntului n raport cu telefonul.
O simulare a unui nivel de balon este o aplicaie care face uz de accelerometru, dar
accelerometrul poate oferi, de asemenea, o baz pentru animaii interactive.
Accelerometru, de asemenea, rspunde la micri brute, cum ar fi shake-uri sau jerks,
utile pentru simulri de zaruri sau alt tip de activitate random.
Este convenabil s reprezinte ieirea accelerometrul ca un vector in spatiul
tridimensional.
Vectori sunt scrisi n caractere aldine, astfel nct vectorul acceleraie poate fi
simbolizat ca (x, y, z). XNA definete un tip de vector tridimensional , iar Silverlight nu.
n timp ce un punct tridimensional (x, y, z) indic o anumit locaie, n spaiu,
vectorul (x,y, z) ncapsuleaz n schimb, o direcie i o magnitudine.
Un punct i un vector sunt legate de: direcia vectorului (x, y, z) care este direcia
din 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 direcia acelei liniei.
Magnitudinea pentru vectorul (x, y, z) este calculabil la forma tridimensional prin
Teorema lui Pitagora:

Pentru a lucra cu accelerometru, telefonul este ca definit n cele trei coordonate


tridimensionale . 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 stnga la dreapta.

Acest sistem de coordonate rmne fixat n raport cu telefonul, indiferent cum se va


ine telefonul, i indiferent de orientarea oricror alte programe care ruleaz pe telefon.
Accelerometrul este baza pentru efectuarea modificrilor de orientare ale aplicaiei
Windows Phone 7.
Atunci cnd telefonul este n continuare ndreptat cu punctele vectorului
accelerometrului spre pmnt, magnitudinea este 1, adica 1 g, care este fora
gravitaional pe suprafaa pmntului. Atunci cnd telefonul este n poziie vertical,
acceleratia are vectorul (0, -1, 0), care este, drept n jos.
Rotind cu 90 telefonul , n sens opus acelor de ceasornic ( spre stnga) , vectorul
acceleraie 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 de
accelerometru (1, 0, 0). Dac telefonul este lsat pe un birou, cu ecranul ndreptat n sus ,
vectorul acceleraie este (0, 0, -1).
Pentru un telefon magnitudinea poate varia n funcie de cteva puncte procentuale,
cu orientri diferite.
Cnd telefonul cu Windows 7, este ndreptat spre Lun , mrimile vectoriale de
accelerare sunt de aproximativ 0,17, dar este limitat recepia telefonului mobil.
Vectorul acceleraie poate indica i n alte direcii (i magnitudinea poate deveni mai
mare sau mai mic), atunci cnd telefonul se accelereaz, poate ctiga sau pierde vitez.
Dac telefonul este n cdere liber, magnitudinea vectorului accelerometrului va
merge, teoretic, n jos la zero.
Pentru a utiliza accelerometru, este nevoie de o referin la biblioteca
Microsoft.Devices.Sensors, i se folosete o directiv pentru spaiul de nume
Microsoft.Devices.Sensors. n WMAppManifest.xml avem nevoie de:
<Capability Name="ID_CAP_SENSORS" /> - prevzut n mod implicit.
n program se va crea o instan a clasei Accelerometer, i se va stabili o rutin de
tratare eveniment pentru evenimentul ReadingChanging i se apeleaz Start.
n proiectul numit SilverlightAccelerometer, se afieaz citirea curent n grila de
coninut. Un TextBlock este definit n fiierul XAML de mai jos:
Silverlight Project: SilverlightAccelerometer

File: MainPage.xaml (excerpt)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">


<TextBlock Name="txtblk"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
Acesta este un program care va afisa vectorul accelerometru pe toat durata de via,
astfel nct creeaz clasa Accelerometer, n constructor i solicit Start:
Silverlight Project: SilverlightAccelerometer File: MainPage.xaml.cs (excerpt)

public MainPage()
{
InitializeComponent();
Accelerometer acc = new Accelerometer();
acc.ReadingChanged += OnAccelerometerReadingChanged;
try
{
acc.Start();
}
catch (Exception exc)
{
txtblk.Text = exc.Message;
}
}
Prin documentaie se avertizeaz c se poate atepta o excepie Start, astfel nct
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 nsoit de evenimentul argumentului
AccelerometerReadingEventArgs. Obiectul are proprieti numite X, Y, Z de tip double
i TimeStamp de tip DateTimeOffset. n programul SilverlightAccelerometer, se vor
formata aceste informaii ntr-un ir de caractere i vor fi setate la proprietatea Text din
TextBlock.
Tratare a evenimentului (n acest caz OnAccelerometerReadingChanged) este
apelat pe un fir de execuie diferit, iar acest lucru nseamn c trebuie s fie manipulate
ntr-un mod special.
Toate elementele pentru interfaa de utilizator, precum i obiectele dintr-o aplicaie
Silverlight sunt create i accesate ntr-un fir principal de execuie, numit firul de interfaa
cu utilizatorul sau UI thread.
Aceste obiecte de interfa pentru utilizator nu sunt fire de siguran; acestea nu sunt
construite 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 direct
elementul TextBlock element pentru a seta, a stabili o nou valoare de proprietate textului
su: Text property.
Exist o soluie care implic o clas Dispatcher definit n spaiul
System.Windows.Threading . Prin aceast clas se pot posta pentru fire non-UI, o list de
ateptare n cazul n care acestea sunt executate mai trziu de ctre firul UI. Acest proces
este complex, dar, din perspectiva programrii sunt uoare deoarece apeleaz metode
simple.
Clasa DependencyObject definete o proprietate Dispatcher , de tip Dispatcher i
mai multe clase Silverlight provin de la DependencyObject. Instanele acestor clase pot fi
accesate de la fire non-UI , pentru c toate au proprieti de Dispatcher.

Se poate folosi orice obiect Dispatcher de la orice derivat DependencyObject create


n fir UI dumneavoastr. Acestea sunt toate la fel.
Clasa Dispatcher definete o metoda numita checkAccess care returneaz true dac
se poate accesa un anumit obiect de interfa cu utilizatorul de la firul curent. Metoda
checkAccess 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 care
le utilizeaz pentru a posta la firul UI.
Proiectul SilverlightAccelerometer implementeaz o versiune elaborat din punct de
vedere 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 multe
argumente 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 metoda
SetTextBlockText . Dac acest lucru nu este posibil se apeleaz metoda BeginInvoke.
Primul argument este o instaniere a delegatului cu metoda SetTextBlockText, apoi este
urmat 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())
{

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 un
delegat. Metoda BeginInvoke are o suprancrcare, care accept un delegat Action care
definete o metoda care nu are nici o valoare de return i nici argumente. Se poate crea o
metod anonim n apelul BeginInvoke.Codul complet dup crearea obiectului string
arata 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 stabilete proprietatea Text din TextBlock este de dorit, ca n
cazul n care a implicat mai mult dect o declaraie, nu este nevoie pentru a apela

CheckAccess. Se poate apela doar BeginInvoke pentru fire de execuie UI thead.


Emulatorul Windows Phone 7 nu conine nici un accelerometru real, astfel nct
ntotdeauna raporteaz o valoare de (0, 0, -1), care indic faptul c telefonul este situat
pe o suprafa plan. Singurul program care ruleaz pe un telefon real este prezentat mai
jos.
Valorile de mai jos indic faptul c telefonul este aproximativ n poziie vertical,
dar nclinat un pic pe spate , orientare natural n utilizarea real.

1.

S-ar putea să vă placă și