HTML

Hackstock

Hack the planet! Hackers unite!

Címkék

Címkefelhő

Egyszerű rajzolás és érintés

2008.01.12. 17:52 :: theshadow

A hosszas hallgatás mögött a háttérben fejlesztés és kutatómunka folyik, általában két-három dolgon dolgozom egyszerre.
A legutolsó eredményem a képernyő érintésének leolvasása. Talán nem árulok el nagy titkot, ha azt mondom, hogy az érintések egérműveletekként jelennek meg. Egérműveletek. Tehát akkor van bal és jobb gomb? Egyelőre csak mondjuk úgy, hogy bal gomb, pontosabban csak egy érintés érzékeléséig tudtam eljutni. A több érintés megoldását még keresem.
Egérműveleteket a UIResponder-ből leszármazó objektumok mouseDown, mouseDragged metódusai segítségével kaphatjuk el. Tehát implementáltam egy UIView-t és a következőket kell kiemelni a header file-ban a működés szempontjából.
CGPoint pos1;
CGPoint pos2;
- (void)drawRect:(struct CGRect)rect;
- (void)mouseDown:(GSEventRef)event;
- (void)mouseDragged:(GSEventRef)event;
Nem árulok zsákbamacskát. A két pontot vonalak rajzolásához fogom felhasználni. Az ujj elmozdulásának leolvasását a két mouse függvény segítségével végezem el. A drawRect függvény a képernyőtartalom frissítésének callback-je.
A privát adattag és az osztály konstruktora így néz ki.
CGMutablePathRef path;

- (TapView*)initWithFrame:(CGRect)rect {
    [super initWithFrame:rect];
    path = CGPathCreateMutable();
    return self;
}
Talán a mouse függvények implementációja sem okoz nagy izgalmat.
- (void)mouseDown:(GSEventRef)event {
    pos2 = [self convertPoint:GSEventGetLocationInWindow(event) fromView:nil];
}

- (void)mouseDragged:(GSEventRef)event {
    pos1 = pos2; pos2 = [self convertPoint:GSEventGetLocationInWindow(event) fromView:nil];
    [self setNeedsDisplay];
}
A pont koordinátáinak konverziójára érdemes odafigyelni. Meglehet, hogy UIView-ba ágyazott UIView esetében kap szerepet. A setNeedsDisplay értesíti az ablakkezelő rendszert, hogy frissíteni kellene. Ennek meghívása váltja ki a drawRect függvény elindítását.
- (void)drawRect:(CGRect)rect {
    CGContextRef context = UICurrentContext();

    float backgroundComponents[4] = {0, 0, 0, 0.3};
    CGContextSetFillColor(context,backgroundComponents);

    CGContextSetLineWidth(context, 1);
    CGContextSetRGBStrokeColor(context, 0.0, 1.0, 0.0, 1.0);
    CGPoint points[] = {pos1,pos2};
    CGPathAddLines(path,nil,points,2);
    CGContextAddPath(context,path);

    CGContextStrokePath(context);
    CGContextFlush(context);
}
A rect paraméter a frissítendő területet jelöli ki, de ettől nyugodtan rajzolhatunk bárhova a UIView-nkon.
Ezen a ponton arra a furcsaságra szeretném felhívni a figyelmet, hogy először minden drawRect híváson belül rajzoltam egy vonaldarabot a CGContextAddLineToPoint metódussal. Ekkor azt  figyeltem meg, hogy vibrált a kép, ahogy az ujjamat mozgatva rajzoltam. Mintha kettős bufferelés lenne és hol egyik, hol másik bufferre rajzoltam volna, tehát a két kép tartalmazta az egész képet (egyes részeit az egyik, másokat a másik). Ezt oldottam meg úgy, hogy egy globális Mutable Path-t hoztam létre és minden alkalommal az új elemeket ahhoz adom hozzá és az egész vonalhalmazt kirajzolom rá. Tartottam némi lassulástól, de ilyet nem tapasztaltam.
A CoreGraphics és GraphicsServices include-olásáról is gondoskodjunk a megfelelő helyeken (az include/CoreGraphics könyvtárban a header-ek tanulmányozásai is érdekes lehet, pl: CGContext, CGPath).
  

Enjoy

Szólj hozzá!

Címkék: iphone appdev

A bejegyzés trackback címe:

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

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.