2008-08-22 10 views
0

Was ist die beste Methode für die Zeugung eines benutzerdefinierten Element sein würde (dh mit J2ME nativen Graphics) auf LWUIT Elemente gemalt?Malerei javax.microedition.lcdui.Graphics auf LWUIT Component

Das benutzerdefinierte Element ist eine Implementierung von Mapping-Bibliothek, die es Inhalt (zum Beispiel Google Maps) zu Graphics-Objekt malt. Wie wäre es möglich, das Ergebnis direkt auf LWUIT Elemente zu malen (im Moment versuche ich es auf einer Komponente zu malen).

ist der einzige Weg, einen Wrapper in LWUIT Paket zu schreiben, die die interne Implementierung davon aussetzen würden?

Edit:

John: Ihre Lösung sieht aus wie eine Menge Technik: P Was ich am Ende mit folgt Wrapper:

package com.sun.lwuit; 

public class ImageWrapper { 
    private final Image image; 

    public ImageWrapper(final Image lwuitBuffer) { 
    this.image = lwuitBuffer; 
    } 

    public javax.microedition.lcdui.Graphics getGraphics() { 
    return image.getGraphics().getGraphics(); 
    } 
} 

Jetzt kann ich die ' natives Grafikelement von LWUIT. Malen Sie darauf - effektiv malen auf LWUIT Bild. Und ich kann das Bild verwenden, um auf einer Komponente zu malen.

Und es sieht immer noch wie ein Hack :)

Aber das eigentliche Problem ist 50kB Codeoverhead, auch nach Verschleierung. Aber das ist ein Thema für einen anderen Beitrag :)

/JaanusSiim

Antwort

0

Basierend auf dem javadoc für LWUIT und J2ME und erraten, dass die benutzerdefinierte J2ME-Klasse ist ein Canvas es sieht aus wie Sie würde:

  • Subclass LWUIT's Component class Einwickeln der benutzerdefinierten J2ME Komponente
  • Aufschalten der Lack() -Methode der LWUIT Komponente
  • Subclass der J2ME Graphics class die LWUIT Graphics-Klasse Verpackung und alle passieren die Methode ruft durch
  • Pass in der J2ME-Komponente der Methode auf die speziellen Farbe Implementierung J2ME Graphics gewickelt

Die dritte Schritt ein hässliches ist. Überprüfen Sie auf LWUIT mailing list, um zu sehen, ob jemand diese Kuppel vorher hat. Von den veröffentlichten APIs sehe ich keinen anderen Weg, dies zu tun.

Edit: Der Hack in der Frage hinzugefügt sieht besser aus als mein Hack für ein Bild. Was ich habe kann besser für einen allgemeinen Fall sein, aber ich kenne weder LWUIT noch J2ME gut genug, um das wirklich zu sagen.

2

Ich glaube nicht, dass Hacking notwendig ist. Sie können die Klasse der LWTUI-Komponente unterklassen, und dann können Sie dem grafischen Kontext der Komponente nach Belieben folgen. Sie erhalten nicht das native lcdui.Graphics-Objekt, sondern ein Objekt mit derselben Benutzeroberfläche, das einfach zu verwenden ist.

Wenn Sie wirklich eine LCDUI passieren müssen.Grafiken auf eine zugrunde liegende Bibliothek seine Ausgabe an die Anzeige dann würde ich vorschlagen, diese:

Irgendwo in Ihrem Komponentencode (nur tun, wenn die Komponente Inhalt wirklich geändert werden müssen):

private Image buffer = null; // keep this 

int[] bufferArray = new int[desiredWidth * desiredHeight]; 
javax.microedition.lcdui.Image bufferImage = 
    Image.createEmptyImage(desiredWidth, desiredHeight); 
thirPartyComponent.paint(bufferImage.getGraphics()); 
bufferImage.getRGB(bufferArray,0,1,0,0,desiredWidth, desiredHeight); 
bufferImage = null; //no longer needed 
buffer = Image.createImage(bufferArray, desiredWidth, desiredHeight); 

in der Komponentenfarbe (g) Methode:

g.drawImage(0,0, buffer); 

Durch den Hack tun Sie Sie portablity verlieren haben und auch Sice Sie Implementierung privates Objekt aussetzen Sie auch andere Dinge brechen könnten.

Hoffe, das hilft.