HTML

Hackstock

Hack the planet! Hackers unite!

Címkék

Címkefelhő

Accelerometer

2007.12.09. 16:39 :: theshadow

Ezúttal a telefon accelerometerével fogunk játszani egy kicsit. Ez az egység, ami meg tudja határozni a térbeli pozícióját. Nem kell nagy dolgokra gondolni, ez nem GPS vagy valami hasonló; csupán azt tudja, hogy a telefon képernyővel felfelé, lefelé, oldalra döntve vagy éppen fejtetőn áll. Ezen a durva felosztáson túl sokkal finomabb meghatározásra is képes.
Nem nagy mágia ezek meghatározása. A UIApplication objektum két callback függvényét fogjuk használni.
- (void)deviceOrientationChanged:(struct __GSEvent *)event
Minden esetben meghívódik, ha a telefon térbeli elhelyezkedése megváltozik. Ebben az esetben a UIHardware deviceOrientation metódusával kérdezhetjük le, hogy a készülék melyik oldalára fordítva helyezkedik el.
- (void)deviceOrientationChanged:(struct __GSEvent *)event
{
    int orient = [UIHardware deviceOrientation: YES];
    NSString *message;
    switch(orient){
        case 0: message = @"Flat, screen upward";
            break;
        case 1: message = @"Normal position";
            break;
        case 2: message = @"Upside down";
            break;
        case 3: message = @"Rotated left";
            break;
        case 4: message = @"Rotated right";
            break;
        case 5: message = @"Changing orientation (?)";
            break;
        case 6: message = @"Screen downward";
            break;
        default:
            message = @"Unknown";
    }
    [tvMessage setText: message];
}
Nem gyakran ugyan, de előfordul, hogy nem a megfelelő érték villan be rövid időre, de szerintem jól használható azokban az esetekben, ha nincs szükség precízebb felbontásra.
Ellenkező esetben egy másik callback függvényt kell implementálni.
- (void) acceleratedInX: (float)x Y:(float)y Z:(float)z
A kísérletezéshez a következő metódust készítettem el.
- (void) acceleratedInX: (float)x Y:(float)y Z:(float)z
{
    [tvMessage setText: [NSString stringWithFormat:@"Acceleration\nX: %f\nY: %f\nZ: %f", x, y, z]];
}
Azt figyeltem meg, hogy minden iránytényező esetében az értékek -0.45 és +0.45 között ingadoznak. Fórumokban olvastam, hogy -0.5 és +0.5 között vehetnek fel értéket.
   
Nézzük csak, hogyan is működik?
Ha balra döntöm a telefont, akkor X értéke 0-tól a maximum felé tart, míg Y a minimum értéktől 0-hoz. Miután teljesen bal oldalára fordítottam és tovább billentem, hogy fejtetőn álljon, X értéke visszatér 0-hoz, Y pedig a maximumhoz. Tovább fordítva X eléri a minimumot és Y a nullához közelít. Vissza térve az normál állapothoz X ismét a nullához tér vissza és Y is a minimum értékhez.
Most magam felé billentve a készüléket Y a minimum értékből nullához jut el, mire a fejem fölé jut a telefon, Z 0-ból a maximumba. Y a maximumába, Z pedig ismét nullába kerül, mire a telefon megint fejjel lefelé áll. Mire vízszintesbe kerül a telefon Y a nullát fogja elérni, míg Z a minimumát. Ismét visszatérve a normál állapothoz Y értéke minimumon, Z pedig 0-án fog állni.
Az érzékelő gravitációs elvű, tehát nincs értelme függőleges tengely mentén történő elfordulást vizsgálni.
Jó játékot.

Szólj hozzá!

Címkék: iphone appdev

A bejegyzés trackback címe:

https://hackstock.blog.hu/api/trackback/id/tr84258056

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.