"Live" zeichnen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • "Live" zeichnen

    Hallo,

    Ich möchte als Gimmik für mein aktuelles Projekt einen kleinen Zeicheneditor hinzufügen, und bin an die Grenzen meines bisher etwas schmalen Wissens über Quarz2D gestoßen.
    Der Editor soll nicht anderes tun als den Letzten Touch einer Touchsequenz mit dem aktuellen durch einen Linie zu verbinden.
    Bisher sind Vorhanden:
    Paintpanel als Subclass von UIView, welches die Touches verarbeitet
    View Controller mit Paintpanel und Buttons für die Farbwahl.

    Mein Problem was ich hab ist, dass ich in den Touchmethoden keinen Graphic Context hab.

    Ich bin mir ziemlich sicher, dass ich nur n depperten Gedankenfehler hab, und die Lösung recht einfach ist, aber ich komm nicht drauf.

    Danke schon mal im Voraus für eure Mühen.

    MfG

    Andibert
    (Ich lese erstmal den Quarz2D Programming Guide weiter)
    $NOSIG
  • RE: "Live" zeichnen

    Kleines Update von mir:

    Mein PaintView erbt nun vom UIImageView
    Einen GraphicsContext erstelle ich mir in der initWithCoder mit UIGraphicsBeginImageContext.
    Und meine EventFunktion sieht folgendermaßen aus:

    Quellcode

    1. -(void)touchesMoved:(NSSet *) touches withEvent: (UIEvent *)event{
    2. CGContextRef ref = UIGraphicsGetCurrentContext();
    3. UITouch *t = [touches anyObject];
    4. CGPoint prev = [t previousLocationInView:self];
    5. CGPoint cur = [t locationInView:self];
    6. CGContextMoveToPoint(ref, prev.x, prev.y);
    7. CGContextAddLineToPoint(ref, cur.x, cur.y);
    8. CGContextStrokePath(ref);
    9. self.image = UIGraphicsGetImageFromCurrentImageContext();
    10. }


    Das Ding funktioniert, ich mache mir nur ein bisschen sorgen wegen der Performance, weil ich ja jedes mal das Image setze.

    MfG

    Andibert
    $NOSIG
  • Noch ein kleines Update von mir.
    Test auf dem IPhone erfolgreich.
    Ich würde jetzt gerne die gezeichnete Kurve glätten, müsste dazu aber den Pfrad speichern, und könnte nicht "live" zeichnen. Schrittweise zeichnen fällt nach meinem Verständnis auch weg, da sich der Linienverlauf durch das Glätten verändert, und somit die alte Linie drunter hervorschaut.
    Kann ich eine eben gezeichneten Pfad durch einen aktualisierten Pfad ersetzen?
    $NOSIG
  • Hmm. Du brauchst doch auch beim Empfangen der Events keinen Context.

    Du kannst doch einfach eine in einem UIView-Subclass Instanzvariable vom Typ CGMutablePathRef halten. Sobald der Benutzer rumtouched fügst du zu dem Pfad mit CGPathAddLineToPoint einfach ein neues Element hinzu und rufst setNeedsDisplay: auf. Dann wird drawRect: aufgerufen und dort zeichnest du dann einfach den Pfad.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Ja, an diese Version hatte ich auch schon gedacht.
    Da ich in der gegenwärtigen Version jedoch sehr einfach ein UIImage erhalte, welches sich auch einfach persistent speichern lässt, bevorzuge ich den ImageContext.

    Mein aktuelles Problem ist jetzt vielmehr, wie ich meine letzte Zeichenoperation rückgängig machen kann.
    So, dass ich einen MutablePath habe, der mit jedem Event verlängert, und gezeichnet wird. und dann, wenn das touchesEnded entsteht wieder vom Context gelöscht wird, und dann geglättet gezeichnet wird. So, dass man bei schnellen Bewegungen auch Kurven und keine eckigen Kurven enthält.
    Sollte ich die Funktionalität auch auf Rechtecke und Kreise zeichnen ausweiten, müsste der Nutzer eh die Möglichkeit haben die Formen auf und zu zu ziehen. Also bräuchte ich spätestens hier die Möglichkeit Zeichenoperationen zurückzunehmen.
    $NOSIG
  • Original von Andibert
    Ja, an diese Version hatte ich auch schon gedacht.
    Da ich in der gegenwärtigen Version jedoch sehr einfach ein UIImage erhalte, welches sich auch einfach persistent speichern lässt, bevorzuge ich den ImageContext.

    Mein aktuelles Problem ist jetzt vielmehr, wie ich meine letzte Zeichenoperation rückgängig machen kann.
    So, dass ich einen MutablePath habe, der mit jedem Event verlängert, und gezeichnet wird. und dann, wenn das touchesEnded entsteht wieder vom Context gelöscht wird, und dann geglättet gezeichnet wird. So, dass man bei schnellen Bewegungen auch Kurven und keine eckigen Kurven enthält.
    Sollte ich die Funktionalität auch auf Rechtecke und Kreise zeichnen ausweiten, müsste der Nutzer eh die Möglichkeit haben die Formen auf und zu zu ziehen. Also bräuchte ich spätestens hier die Möglichkeit Zeichenoperationen zurückzunehmen.


    Das was du machst ist absolut nicht vorgesehen...

    Es gibt auch ohne UIImageView eine einfache Art an ein UIImage zu kommen.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Es gibt auch ohne UIImageView eine einfache Art an ein UIImage zu kommen.

    Nicht das wir uns falsch verstehen:
    Das UIImage erhalte ich von dem ImageContext über UIGraphicsGetImageFromCurrentImageContext();.
    Das UIImageView verwende ich zum Darstellen.

    Im übrigen bin ich natürlich für konkrete hinweise wie es schöner oder einfacher zu lösen ist immer dankbar. Ich bin ja schließlich erst seit ein paar Wochen beim IPhone Programmieren.
    $NOSIG