Nokioteca [Nokia] Forum: Diesgnare In Java - Nokioteca [Nokia] Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

Diesgnare In Java

#1 L   JumpJack_ 

  • Senior Member
  • Gruppo: Developer
  • Messaggi: 993
  • Iscritto: 29 agosto 2006
  • Cellulare:a1000,6680

Inviato 17 luglio 2008 - 11:04

Come faccio a visualizzare un'immagine e a disegnarci sopra, in j2me?
Ho trovato un paio di sorgenti di esempio, ma non riesco ad implementarli in netbeans! B)

Con netbeans ho inserito un imageitem che contiene un'immagine, e questa viene visualizzata correttamente; ma come faccio a disegnarci sopra, adesso?!?

Questo è il codice creato da netbeans:
  /**
	 * Returns an initiliazed instance of imageItem component.
	 * @return the initialized component instance
	 */
	public ImageItem getImageItem() {
		if (imageItem == null) {
			// write pre-init user code here
			imageItem = new ImageItem("Grande Raccordo Anulare", getImage1(), ImageItem.LAYOUT_DEFAULT, "<Missing Image>");
			// write post-init user code here
		}
		return imageItem;
	}
	//</editor-fold>

	//<editor-fold defaultstate="collapsed" desc=" Generated Getter: image1 ">
	/**
	 * Returns an initiliazed instance of image1 component.
	 * @return the initialized component instance
	 */
	public Image getImage1() {
		if (image1 == null) {
			// write pre-init user code here
			try {
				image1 = Image.createImage("/gra-num.png");
			} catch (java.io.IOException e) {
				e.printStackTrace();
			}
			// write post-init user code here
		}
		return image1;
	}


come accedo all'immagine per disegnarci sopra?!? con image1.getGraphics() ? e poi? Ci ho provato, ma le modifiche non risultano visibili.
Forse c'entra la storia della canvas con la funzione paint() richiamata automaticamente dal sistema??... boh?...
0

#2 L   Il.Socio 

  • Nokioteca Staff
  • Gruppo: Moderatore
  • Messaggi: 7126
  • Iscritto: 02 dicembre 2005
  • Località:Torino
  • Cellulare:N8-00

Inviato 17 luglio 2008 - 20:37

sono un po' arruginito, ma la prima cosa che mi verrebbe in mente e' di ereditare da canvas ed implementare il metodo paint per disegnare l'immagine e quant'altro.
Per segnalare allo Staff un messaggio non conforme al regolamento è sufficiente premere il bottone "Segnala" posizionato in basso a sinistra di ciascun messaggio.
0

#3 L   JumpJack_ 

  • Senior Member
  • Gruppo: Developer
  • Messaggi: 993
  • Iscritto: 29 agosto 2006
  • Cellulare:a1000,6680

Inviato 18 luglio 2008 - 08:47

Visualizza MessaggiIl.Socio, il 17/07/2008 - 21:37, ha scritto:

sono un po' arruginito, ma la prima cosa che mi verrebbe in mente e' di ereditare da canvas ed implementare il metodo paint per disegnare l'immagine e quant'altro.


ci sono riuscito.

Bisogna accodare al sorgente (anche in netbeans) una classe derivata da Canvas:


class MyCanvas extends Canvas implements CommandListener {
private Command exit;

private mTrafficLC mTrafficLC;

private Image imm_image; // Immutable image (to be loaded from filesystem)
private Image mut_image; // Mutable image (i.e. drawable).

public MyCanvas(mTrafficLC mTrafficLC) {
this.mTrafficLC = mTrafficLC;
exit = new Command("Exit", Command.EXIT, 1);
addCommand(exit);
setCommandListener(this);
try {
imm_image = Image.createImage("/gra-num.png"); // Load image from disk
}
catch (Exception e) {
System.out.println("ERROR: Image gra-num.png not found.");
e.printStackTrace();
}
// Create mutable image same size of just loaded (and immutable) image:
mut_image = Image.createImage(imm_image.getWidth(),imm_image.getHeight());
}

protected void paint(Graphics g) {
Graphics offGrap = mut_image.getGraphics(); // Get a working copy (=graphics) of the mutable image for drawing on it.
offGrap.setColor(0xff0000);
offGrap.drawImage(imm_image, 0, 0, 0); // Copy immutable (loaded) image into mutable image.
for (int i=0; i<=23; i++) {
offGrap.setColor(mTrafficLC.Colors[i][0],mTrafficLC.Colors[i][1],mTrafficLC.Colo
rs[i][2]);
offGrap.drawLine(mTrafficLC.Segments[i][0],mTrafficLC.Segments[i][1],mTrafficLC.
Segments[i+1][0],mTrafficLC.Segments[i+1][1]);
}
g.drawImage(mut_image, 0,0, Graphics.LEFT | Graphics.TOP);
}

public void commandAction(Command command, Displayable display) {
if (command == exit) {
mTrafficLC.exitMIDlet();
}
}
}


Nella classe bisogna:
- creare un'immagine immutabile (imm_image), caricando da disco con CreateImeage()
- creare un'immagine mutabile (mit_image), cioe' un'immagine vuota (sempre con CreateImage()) in cui copieremo quella caricata
- definire il metodo paint in modo che disegni sull'immagine mutabile; per farlo, bisogna prendere una "copia di lavoro" dell'immagine mutabile con Graphics offGrap = mut_image.getGraphics(), copiarci dentro l'immagine caricata ( offGrap.drawImage(imm_image, 0, 0, 0) ), disegnare a piacimento sull'immagine ( offGrap.drawLine( ...)( ), e rendere visibile il risultato ( g.drawImage(mut_image, 0,0, Graphics.LEFT | Graphics.TOP); )
0

#4 L   Il.Socio 

  • Nokioteca Staff
  • Gruppo: Moderatore
  • Messaggi: 7126
  • Iscritto: 02 dicembre 2005
  • Località:Torino
  • Cellulare:N8-00

Inviato 18 luglio 2008 - 17:30

allora non ero poi cosi' arruginito B) derivi da canvas ed implementi il paint B)

Il double buffering ti permette di evitare il flickering, ma ti ciuccia memoria, credo che avresti anche potuto disegnare prima imm_image e poi disegnare le linee direttamente su Graphics g buttando via mut_image... In alternativa, se ci tieni al double-buffering, ti conviene spostare offGrap a livello di classe ed inizializzarla nel costruttore.

Messaggio modificato da Il.Socio il 18 luglio 2008 - 17:41

Per segnalare allo Staff un messaggio non conforme al regolamento è sufficiente premere il bottone "Segnala" posizionato in basso a sinistra di ciascun messaggio.
0

#5 L   JumpJack_ 

  • Senior Member
  • Gruppo: Developer
  • Messaggi: 993
  • Iscritto: 29 agosto 2006
  • Cellulare:a1000,6680

Inviato 21 luglio 2008 - 07:27

Visualizza MessaggiIl.Socio, il 18/07/2008 - 18:30, ha scritto:

allora non ero poi cosi' arruginito B) derivi da canvas ed implementi il paint ;)

Il double buffering ti permette di evitare il flickering, ma ti ciuccia memoria, credo che avresti anche potuto disegnare prima imm_image e poi disegnare le linee direttamente su Graphics g buttando via mut_image... In alternativa, se ci tieni al double-buffering, ti conviene spostare offGrap a livello di classe ed inizializzarla nel costruttore.

non me po' frega' de meno del double buffering ! ;-) Devo solo disegnare un'immagine una volta, poi il programma si puo' anche chiudere (e' il porting java del programma per il traffico sul raccordo).

Cmq grazie, magari mi potrà tornare utile in futuro. B)
0

#6 L   Il.Socio 

  • Nokioteca Staff
  • Gruppo: Moderatore
  • Messaggi: 7126
  • Iscritto: 02 dicembre 2005
  • Località:Torino
  • Cellulare:N8-00

Inviato 22 luglio 2008 - 08:01

B)
allora una cosa del genere dovrebbe essere sufficiente...
protected void paint(Graphics g) 
{
	g.setColor(0xff0000);
	g.drawImage(imm_image, 0, 0, 0); // Copy immutable (loaded) image into mutable image.
	for (int i=0; i<=23; i++) 
	{
		g.setColor(mTrafficLC.Colors[i][0],mTrafficLC.Colors[i][1],mTrafficLC.Colors[i][
2]);
		g.drawLine(mTrafficLC.Segments[i][0],mTrafficLC.Segments[i][1],mTrafficLC.Segmen
ts[i+1][0],mTrafficLC.Segments[i+1][1]);
	}
}

Per segnalare allo Staff un messaggio non conforme al regolamento è sufficiente premere il bottone "Segnala" posizionato in basso a sinistra di ciascun messaggio.
0

#7 L   JumpJack_ 

  • Senior Member
  • Gruppo: Developer
  • Messaggi: 993
  • Iscritto: 29 agosto 2006
  • Cellulare:a1000,6680

Inviato 22 luglio 2008 - 15:40

Visualizza MessaggiIl.Socio, il 22/07/2008 - 09:01, ha scritto:

B)
allora una cosa del genere dovrebbe essere sufficiente...
protected void paint(Graphics g) 
{
	g.setColor(0xff0000);
	g.drawImage(imm_image, 0, 0, 0); // Copy immutable (loaded) image into mutable image.
	for (int i=0; i<=23; i++) 
	{
		g.setColor(mTrafficLC.Colors[i][0],mTrafficLC.Colors[i][1],mTrafficLC.Colors[i][
2]);
		g.drawLine(mTrafficLC.Segments[i][0],mTrafficLC.Segments[i][1],mTrafficLC.Segmen
ts[i+1][0],mTrafficLC.Segments[i+1][1]);
	}
}

ah, quindi non mi serve di appoggiarmi a offGrap, posso disegnare direttamente su g.
Ottimo.

Ora pero' sto impazzendo per riuscire a disegnare una linea della larghezza voluta: non esiste un'opzione per specificare la larghezza delle linee, in j2me, e sto cercando di implementarla io, usando funzioni trigonometriche per calcolare le coordinate di tutti i punti della linea, e sostituirli con cerchietti pieni.... Quindi ho dovuto anche far riferimento a una lilbreria aggiuntiva, perche' di suo j2me non supporta funzioni trigonometriche... B)

Qualche idea migliore? Non va bene nemmeno pitagora, perche' non è implementata neanche la funzione pow().
0

Condividi questa discussione:


Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione