Hirdetés

Alkalmazásfejlesztés badára: Mozgásérzékelés badán

Bevezetés

Mint a legtöbb mai okostelefon, a Samsung Wave (és a többi badát futtató készülék) is rendelkezik beépített szenzorokkal, amelyek között megtalálható a fényérzékelő, közelség-érzékelő és a giroszenzor, azaz a mozgásérzékelő. Utóbbival fogunk részletesebben foglalkozni a bejegyzés során.

Szenzorok

A badás telefonokban a mozgásérzékelő két fajta mozgást képes megkülönböztetni, az egyik a billentés, a másik a rázás. A billentés, azaz a snap az a művelet, amikor a telefont hirtelen megdönjük egyik irányba, majd visszaállítjuk az eredeti pozíciójába. Mivel bada a Descartes-kooridnátarendszert használja az irányok leírására, összesen hatot különböztetünk meg,a három tengely miatt: az X, Y és Z tengelyek pozitív és negatív félegyeneseinek megfelelő irányokba billenthetünk. Portrait módban (vagyis amikor a telefont függőlegesen állítva használjuk) az X és a Z tengelyeknek mentén történő mozgásokat képes észlelni a telefon, landscape módban (azaz 90°-kal elforgatva) pedig az Y és Z tengelyeknek megfelelőket érzékeli.

A rázás, azaz a shake igazából a snap művelet többszörös egymás utáni elvégzése. Itt nem különböztetünk meg irányokat, ugyanúgy működik a dolog portrait és landscape módban is. Viszont megkülönböztetjük, hogy a rázásnak mely fázisában vagyunk, ez a MotionState paraméteren keresztül történik. Ez három értéket vehet fel: a MOTION_STARTED a shake  esemény regisztrálásának kezdetét, a MOTION_INPROGRESS a folyamatban lévő rázást, a MOTION_ENDED pedig a befejezést jelöli. Létezik egy negyedik érték is, a MOTION_CANCELLED, ez fenntartott (reserved), azaz nem használhatjuk.

A mozgásérzékeléshez szükséges interfészen keresztül egy harmadik fajta interakció érzékelésére is felkészíthetjük az alkalmazásunkat, ez a dupla érintés, azaz a double tap. Igazából nem tudom, miért került egy interfészbe a másik kettővel, de ha már itt van, nem lenne szép dolog kihagyni a bejegyzésből.

Hogyan néz ki mindez kód szinten?

Nem egy bonyolult dolog. Először is implementálnunk kell az ezt megvalósító Osp::Uix::IMotionEventListener interfészt (bővebb info itt), amely a mozgásérzékelést megvalósító függvényeket tartalmazza. Ez három függvényt jelent, az egyik az  OnShakeDetected(Osp::Uix::MotionState motionState), amely a rázás események érzékeléséért felel, a másik a OnSnapDetected(Osp::Uix::MotionSnapType snapType), amely a billentéseket figyelni, az OnDoubleTapDetected(void) pedig a dupla érintéseket észleli. Ezek implementálása mellett szükségünk lesz egy Osp::Uix::Motion (további információért ajánlom a hivatalos referenciát) típusú változóra, amely a mozgásérzékelés inicializálásáért és kezeléséért felel. A kétfázisú konstruktornak megfelelően először példányosítani, majd constructolni kell a változónkat, ezeket célszerű az inicializáló függvényben megtenni. Ez után meg kell adnunk, mely mozgástípusok érzékelését engedélyezzük neki, ezt a SetEnabled() függvénnyel tehetjük meg. Utóbbinak ötfajta bemenő paramétert adhatunk meg:

  • MOTION_TYPE_NONE - egyikre sem figyel
  • MOTION_TYPE_SNAP - billentésre
  • MOTION_TYPE_SHAKE - rázásra
  • MOTION_TYPE_DOUBLETAP - dupla érintésre
  • MOTION_TYPE_ALL - mindhárom típusra

Természetesen a három megfelelő érzékeléstípus tetszés szerinti kombinációját is megadhatjuk, ha például csak a rázásra és a dupla érintésre szeretnénk figyelni, a (MOTION_TYPE_SHAKE | MOTION_TYPE_DOUBLETAP) sort kell bemenőként megadnunk. Egy alkalmazásnak egyébként több Motion típusú paramétere is lehet, összesen maximum öt, így az eltérő érzékelési feladatokra nem muszáj ugyanazt a példányt használnunk.

A példaalkalmazás a bejegyzésben ismertetett funkciók használatát illusztrálja, természetesen ismét elérhető a mobilarénás SVN-ből, a projekt a SensorTest névre hallgat.

dr. Kind

Azóta történt

Előzmények