Então… o outro tópico eu fechei, aquela parte ta resolvida xD agora tem outro problema…
A transição de imagens fica piscando…alguma idéia de alguém?
Classe do efeito (extende JXImagePanel):
[code]package demo;
import java.awt.AlphaComposite;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import org.jdesktop.swingx.JXImagePanel;
public class Efeito2 extends JXImagePanel {
private Contador contador;
private BufferedImage img1, img2, img3, img4, img5;
private volatile float alpha = 1.0f;
private float add = -0.02f;
private Image imgAux;
private Image imagem1, imagem2;
public Efeito2() {
setSize(800, 600);
setIgnoreRepaint(true);
final String endereco[] = new String[5];
endereco[0] = "/demo/images/imagem1.jpg";
endereco[1] = "/demo/images/imagem2.jpg";
endereco[2] = "/demo/images/imagem3.jpg";
endereco[3] = "/demo/images/imagem4.jpg";
endereco[4] = "/demo/images/imagem5.jpg";
img1 = carregarImagem(endereco[0]);
img2 = carregarImagem(endereco[1]);
img3 = carregarImagem(endereco[2]);
img4 = carregarImagem(endereco[3]);
img5 = carregarImagem(endereco[4]);
setVisible(true);
//Iniciamos a thread que fará a imagem se repintar várias vezes
//Isso dá o efeito de animação.
Thread t = new Thread(new DemoThread(), "Thread de demonstração");
t.setDaemon(true);
t.start();
contador = new Contador(new Image[]{img1, img2, img3, img4, img5});
imgAux = contador.next();
imagem1 = imgAux;
imagem2 = contador.next();
}
private BufferedImage carregarImagem(String image) {
try {
//Carrega a imagem do disco
BufferedImage img = ImageIO.read(getClass().getResource(image));
//Converte ela para o formato da tela. Isso aumenta muito as chances do seu desenho ser acelerado por hardware.
//O processo de covers�o � simples. Simplesmente criamos uma imagem com a configura��o da tela, e desenhamos
//a imagem carrega sobre esta.
//Tamb�m j� farei aqui o redimensionamento para o tamanho da tela, evitando gastar tempo com isso na hora de
//desenhar na tela.
BufferedImage imagem = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(getWidth(), getHeight(), Transparency.TRANSLUCENT);
Graphics2D g2d = imagem.createGraphics();
g2d.drawImage(img, 0, 0, imagem.getWidth(), imagem.getHeight(), 0, 0, img.getWidth(), img.getHeight(), null);
g2d.dispose();
//Retornamos a imagem redimensionada e otimizada
return imagem;
} catch (IOException e) {
throw new RuntimeException("Não foi possível carregar a imagem");
}
}
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
//Desenhamos a imagem 1
g2d.drawImage(/*img1*/imagem1, 0, 0, null);
//Nesta linha, alteramos a transpar�ncia de tudo que ser� desenhado
//sobre o graphics.
g2d.setComposite(AlphaComposite.SrcOver.derive(alpha));
//contador.next();
//E então desenhamos a imagem 2, sobre a imagem 1.
g2d.drawImage(/*img2*/imagem2, 0, 0, null);
//Variamos o alpha
alpha += add;
if (alpha < 0.02) {
add = 0.02f;
} else if (alpha > 0.98) {
add = -0.02f;
}
g2d.dispose();
}
public class DemoThread implements Runnable {
@Override
public void run() {
try {
//Para fazer a animação, simplesmente chamamos o repaint várias vezes
//Essa é uma forma bem rudimentar de animar. O Ponto V! descreve mecanismos
//melhores.
while (true) {
repaint();
Thread.sleep(1000 / 15); //15 fps
if (alpha < 0.02 || alpha > 0.98) {
System.out.println("ENTROU!");
Thread.sleep(2000);
imagem1 = imagem2;
((Graphics2D) imagem1.getGraphics()).setComposite(AlphaComposite.SrcOver.derive(0.98F));
imagem2 = contador.next();
((Graphics2D) imagem2.getGraphics()).setComposite(AlphaComposite.SrcOver.derive(0.02F));
}
}
} catch (InterruptedException e) {
//JOptionPane.showMessageDialog(getContentPane(), e);
}
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Efeito2().setVisible(true);
}
});
}
}
[/code]
Classe pra mudar as imagens… (esse método next() ai xD):
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package demo;
import java.awt.Image;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/**
*
-
@author melissa
*/
public class Contador {private ArrayList imgs;
private int pointer;public Contador(Image[] images) {
imgs = new ArrayList(Arrays.asList(images));
pointer = 0;
System.out.println("Tamanho: " + images.length);
}
public Contador(Collection col) {
imgs = new ArrayList(col);
pointer = 0;
}
public Image next() {
if (pointer >= imgs.size()) {
pointer = 0;
}Image next = imgs.get(pointer);
System.out.println(“next(): " + next.toString() + " (” + pointer + “)”);
pointer++;
return next;
}
}[/code]
Alguma idéia?