Documente Academic
Documente Profesional
Documente Cultură
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:
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.
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
1.