¿Cómo desvanezco una imagen en swing?
Tengo una clase que hereda de JPanel con una imagen y quiero configurar una pequeña animación para mostrar el panel/imagen y luego desvanecerlo cuando se activa un evento.
Presumiblemente configuré un hilo y lancé la animación, pero ¿cómo hago realmente el desvanecimiento?
Puede realizar el subprocesamiento usted mismo, pero podría ser más fácil usar la biblioteca Trident para manejarlo. Si crea un definidor en su clase llamado (digamos, setOpacity
), puede pedirle a Trident que interpola el campo de "opacidad" de 1,0 a 0,0 durante un período de tiempo específico (aquí se muestran algunos de los documentos sobre cómo usar Trident).
Cuando estás pintando la imagen, puedes hacer la transparencia con un AlphaComposite
, usando el valor de "opacidad" actualizado para el parámetro alfa de la composición. Hay un tutorial de Sun que incluye un ejemplo de compuesto alfa .
A continuación se muestra un ejemplo que utiliza la transparencia alfa. Puede utilizar esta herramienta compuesta para ver el resultado del uso de diferentes colores, modos y alfas.
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import javax.swing.*;
public class AlphaTest extends JPanel implements ActionListener {
private static final Font FONT = new Font("Serif", Font.PLAIN, 32);
private static final String STRING = "Mothra alert!";
private static final float DELTA = -0.1f;
private static final Timer timer = new Timer(100, null);
private float alpha = 1f;
AlphaTest() {
this.setPreferredSize(new Dimension(256, 96));
this.setOpaque(true);
this.setBackground(Color.black);
timer.setInitialDelay(1000);
timer.addActionListener(this);
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setFont(FONT);
int xx = this.getWidth();
int yy = this.getHeight();
int w2 = g.getFontMetrics().stringWidth(STRING) / 2;
int h2 = g.getFontMetrics().getDescent();
g2d.fillRect(0, 0, xx, yy);
g2d.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_IN, alpha));
g2d.setPaint(Color.red);
g2d.drawString(STRING, xx / 2 - w2, yy / 2 + h2);
}
@Override
public void actionPerformed(ActionEvent e) {
alpha += DELTA;
if (alpha < 0) {
alpha = 1;
timer.restart();
}
repaint();
}
static public void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame();
f.setLayout(new GridLayout(0, 1));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new AlphaTest());
f.add(new AlphaTest());
f.add(new AlphaTest());
f.pack();
f.setVisible(true);
}
});
}
}
Aquí encontrará información útil que describe la transparencia de la imagen .
Su enfoque sería algo como esto:
- Defina un Swing
Timer
para activar unActionEvent
hilo en el envío de eventos cada N milisegundos. - Agregue un
ActionListener
alTimer
que debería invocarrepaint()
elComponent
que contiene el archivoImage
. - Anule el método
Component
depaintComponent(Graphics)
para hacer lo siguiente:- Lanza el
Graphics
objeto a unGraphics2D
. - Establezca un
AlphaComposite
usoGraphics2D
.setComposite
Esto controla el nivel de transparencia. - Dibuja la imagen.
- Lanza el
Para cada iteración de su animación de desvanecimiento, cambiaría los valores de AlphaComposite
para hacer la imagen más transparente.