J2ME mit Canvas malen, nur Punkte

T

Tobias4Rock

Gast
Hi @ all,

im Rahmen eines Vokabeltrainer Projekts für Chinesische Zeichen auf dem Handy mit J2ME, möchte ich mittels einer Klasse die von Canvas erbt auf dem Touchscreen zeichnen, sowohl auf dem Handy als auch im Emulator scheint die Anwendung jedoch nicht ganz hinterherzukommen, d.h. wenn man zu schnell schreibt kommen nur Punkte, keine zusammenhängenden Linien. Mit einer Vorinstallierten Software auf dem Smartphone klappt es jedoch wunderbar, an der Leistung der Hardware kann es also nicht liegen, ich nehme an eher an der Java Engine.
Als ich mal zur Übung etwas ähnliches als Java Applet geschrieben habe hatte ich das gleiche Problem.

Hat irgendwer ne Idee woran es liegen könnte?

Wäre euch sehr dankbar für jeden Tipp!
LG,
Tobias


Die beiden relevanten Methoden der Klasse, die von Canvas erbt:
Code:
    protected  void pointerDragged(int x, int y) {
        this.x=x;
        this.y=y;
        repaint();
    }


    public void paint(Graphics g) {
        g.setColor(0);
        g.fillRect(x, y, 6, 6);       
    }
 
Emulator klappt, Handy leider nicht

Hi,

für den Fall, dass sich doch noch wer meldet, der sich damit auskennt, erkläre ich mal kurz, was ich bisher ausprobiert habe und damit nur leider vor einem neuen Problem stehe:

Ich habe mir gedacht, dass, bis auf dann, wenn der Touchscreen losgelassen wird bzw. noch nie zuvor berührt wurde, soll zwischen den einzelnen Punkten immer eine Verbindungslinie gezeichnet werden, um diese ganze Punktgeschichte zu umgehen.
Im Emulator funktioniert das Bestens, auf meinem Samsung Handy i900 Omnia leider nicht, da hier irgendein Bug in dem JavaInterpreter ist, den ich leider nicht schaffe zu umgehen.

d.h. der relevante Teil in der paint() Methode ist:
Code:
        //wenn nicht losgelassen und der bildschirm nicht zum ersten mal berührt wird
        if(pointerReleased == false && prevY != 0)
        {
            g.drawLine(prevX, prevY, x, y);
        }
        else
        {
            pointerReleased = false;
        }
        prevX = x;
        prevY = y;
    }

,wobei prevY und prevX anfangs den Wert 0 haben.

Wie gesagt, im Emulator klappt das bestens, beim Handy verbindet er jedoch immer alle Punkte, auch dann, wenn der Bildschirm zwischendurch losgelassen wurde. Einzige Ausnahme scheint hier zu sein, wenn zwischendurch einmal der Bildschirm nur berührt wurde (pointerPressed(), ohne pointerDragged() aufgerufen zu haben), dann setzt er den Anfangspunkt der Linie an den Punkt an dem Der Bildschirm berührt wurde.

Um den Fehler zu lokalisieren, habe ich mir immer einen Text ausgeben lassen, wenn die entsprechende Methode aufgerufen wurde: (gekürzt)

Code:
 /**
     * Called when the pointer is dragged.
     */
    protected  void pointerDragged(int x, int y) {
        this.x=x;
        this.y=y;
        pointerDragged = true;
        repaint();
    }

    /**
     * Called when the pointer is pressed.
     */
    protected  void pointerPressed(int x, int y) {
        this.x=x;
        this.y=y;
        pointerPressed = true;
        repaint();
    }

    /**
     * Called when the pointer is released.
     */
    protected  void pointerReleased(int x, int y) {
        pointerReleased = true;
      repaint();
    }


    public void paint(Graphics g) {
        // bildschirm mit weiss uebermalen
        g.setColor(0x00FFFFFF);
        g.fillRect (0, 0, breite, hoehe);
        g.setColor(0);
        
        //tests
        //wenn pointerDragged == true
        if(pointerDragged == true)
        {
            g.drawString("pointerDragged", 20, 10, Graphics.TOP|Graphics.LEFT);
        }
        pointerDragged = false;
         //wenn pointerPressed == true
        if(pointerPressed == true)
        {
            g.drawString("pointerPressed", 20, 20, Graphics.TOP|Graphics.LEFT);
        }
        pointerPressed = false;
         //wenn pointerReleased == true
        if(pointerReleased == true)
        {
            g.drawString("pointerReleased", 20, 30, Graphics.TOP|Graphics.LEFT);
        }
        pointerReleased = false;
    }

Wider erwarten scheint der Aufruf von PointerReleased jedoch auch auf dem Handy Wirkung zu zeigen, der entsprechende Text wird angezeigt.
Einziger Unterschied zum Emulator: Beim loslassen wird neben "pointerReleased" auch noch immer "pointerDragged" angezeigt, selbst wenn vorher nur "pointerPressed" angezeigt wurde.

Ich habe eig. fast alles ausprobiert, was mir in den Sinn kam und weiß einfach nicht, wie ich das Problem anpacken soll, da mein Code ja vollkommen richtig ist, wie der Emulator ja auch zeigt, an dem alles wie geplant funktioniert. Wenn also doch noch jemand eine Idee oder auch nur einen kleinen Tipp hat, wäre ich wirklich sehr dankbar!
Vielen Dank,
Tobias
 
Zurück
Oben