Manipulando Imagens em Canvas

23 junho 2009

Vimos anteriormente como trabalhar com as "Primitivas da classe Canvas" e o que o J2ME nos oferece para trabalhar com desenhos básicos, agora vamos mostrar na tela uma imagem de extensão .png. Primeiro crie a sua imagem em algum editor externo a sua escolha, salve a imagem e coloque no mesmo diretório onde se localiza o arquivo .java.

Desenhando uma imagem

Primeiramente vamos incluir o pacote java.io que contém o tratamento de exceção.

import java.io.*;
import javax.microedition.lcdui.*;

Agora criaremos uma variável da classe Image.

import java.io.*;
import javax.microedition.lcdui.*;

public class ClasseMeuCanvas extends Canvas {
Image minhaImagem;
public void paint(Graphics meuGrafico){
}
}
Agora vamos usar o construtor para inicializar o objeto minhaImagem. Para isso vamos lançar a exceção.

import java.io.*;
import javax.microedition.lcdui.*;

public class ClasseMeuCanvas extends Canvas {
Image minhaImagem;

ClasseMeuCanvas throws Exception {
}
public void paint(Graphics meuGrafico){
}
}
Agora dentro do construtor vamos inicializar o objeto minhaImagem utilizando o método createImage() da classe Image, ele receberá como parâmetro o endereço da imagem que você criou.

import java.io.*;
import javax.microedition.lcdui.*;

public class ClasseMeuCanvas extends Canvas {
Image minhaImagem;

ClasseMeuCanvas throws Exception {
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}
public void paint(Graphics meuGrafico){
}
}
Agora dentro do método paint() vamos colocar a nossa imagem para ser exibida, utilizando o método drawString() da classe Graphics, como parâmetro ele irá receber 4 atributos: o 1ª será o nome da variável da classe Image, o 2º será o pixel x de onde vai ser desenhado, o 3º será o pixel y de onde vai ser desenhado, o 4º será a "raiz" do objeto, ou seja, onde será a referência dos pixels x e y.

import java.io.*;
import javax.microedition.lcdui.*;

public class ClasseMeuCanvas extends Canvas {
Image minhaImagem;

ClasseMeuCanvas throws Exception {
minhaImagem = minhaImagem.createImage("/Minha Imagem.png");
}
public void paint(Graphics meuGrafico){
meuGrafico.drawImage(minhaImagem, 30, 40, Graphics.LEFT|Graphics.TOP);
}
}
Splash em Canvas com imagem centralizada

É muito usado em aplicações para mobiles uma tela inicial chamada de splash, cuja função é de mostrar o logo da empresa/aplicação, bem como uma tela de boas vindas. É interessante manter uma figura pequena e padronizada para a maioria dos celulares, para que não seja necessário ficar redimensionando a imagem, pois além de gastar muito processamento a imagem não fica nítida como a original. Então segue um trecho de código que implementa uma tela de apresentação em canvas com a figura reduzida no centro da tela.

Para tal tarefa insira no médoto paint() as seguintes linhas:

public void paint(Graphics g) {
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());

try {
Image img = Image.createImage("/img/gpmobile.png");
//INSERE IMAGEM NO CENTRO DA TELA
int x= (getWidth()/2) - (img.getWidth()/2);
int y= (getHeight()/2) - (img.getHeight()/2);
g.drawImage(img, x, y, Graphics.TOP | Graphics.LEFT);
} catch (IOException ex) {
ex.printStackTrace();
}
}
Obs.: Para trabalhar com imagens em Canvas, por exemplo construir a tela de splash, é interessante startar o MIDPCanvas em uma nova Thread. Algo semelhante ao seguinte trecho de código:

public void startMidlet(){
final MIDPCanvas canvas = new MIDPCanvas(this);
Thread t = new Thread(new Runnable() {
public void run() {
switchDisplayable(null, canvas);
}
});
t.start();
try {
Thread.sleep(2000);//Mili Segundos
} catch (InterruptedException ex) {
ex.printStackTrace();
}
...
}
Por sua vez o MIDPCanvas fica da seguinte maneira:

import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.Image;

public class MIDPCanvas extends Canvas implements CommandListener {
MIDletPrincipal MidletCanvas;
public MIDPCanvas(MIDletPrincipal canvas) {
try {
MidletCanvas = canvas;
setCommandListener(this);

} catch(Exception e) {
e.printStackTrace();
}
}

//métodos necessários
...

private int[] reescalaArray(int[] ini, int x, int y, int x2, int y2){
...

public void paint(Graphics g) {
...
}

0 comentários:

Postar um comentário