Malerei javax.microedition.lcdui.Graphics auf LWUIT Komponente

stimmen
0

Was wäre die beste Methode für ein benutzerdefiniertes Element bekommen (das heißt mit J2ME nativen Graphics) auf LWUIT Elementen gemalt?

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, um einen Wrapper in LWUIT Paket zu schreiben, die die interne Implementierung davon aussetzen würden?

Bearbeiten:

John: Ihre Lösung sieht aus wie eine Menge Technik: P Was ich am Ende mit ist folgende 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 das ‚native‘ Graphics Element aus LWUIT erhalten. Malen Sie auf sie - effektiv Malerei 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

Veröffentlicht am 22/08/2008 um 21:17
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Ich glaube nicht, dass Hacking notwendig. Sie können die LWTUI Component-Klasse Unterklasse und dann können Sie Schmerzen, was wollen Sie mit dem graphischen Kontext der Komponente auf. Sie erhalten nicht das native lcdui.Graphics Objekt, sondern ein Objekt mit einer gleichen Oberfläche, die leicht zu bedienen ist.

Wenn Sie wirklich eine lcdui.Graphics auf eine zugrunde liegende Bibliothek übergeben müssen seine Ausgabe angezeigt wird, dann würde ich dies vorschlagen:

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

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 zu tun haben Sie Sie portablity verlieren und auch Sice Sie Implementierung privates Objekt aussetzen Sie auch andere Dinge brechen könnten.

Hoffe das hilft.

Beantwortet am 17/09/2008 um 19:45
quelle vom benutzer

stimmen
0

Basierend auf dem javadoc für LWUIT und J2ME und erraten , dass die benutzerdefinierten J2ME - Klasse ist eine Leinwand sieht es aus wie Sie haben würden:

  • Unterklasse LWUIT Component - Klasse der benutzerdefinierten J2ME Komponente Einwickeln
  • Überschreiben Sie die Farbe () -Methode der LWUIT Komponente
  • Subklassen die J2ME Graphics - Klasse die LWUIT Graphics - Klasse Verpackung und übergeben alle Methodenaufrufe durch
  • Der Pass in der J2ME Graphics gewickelten Umsetzung der Custom-Lackierung Methode J2ME Komponente

Dieser dritte Schritt ist ein hässliche. Überprüfen Sie auf der LWUIT Mailing - Liste , um zu sehen , ob jemand Kuppel hat dies vor. Aus den veröffentlichten APIs sehe ich nicht einen anderen Weg , es zu tun.

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

Beantwortet am 08/09/2008 um 01:52
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more