java - redimensionar - ¿Cómo me desvanezco una imagen en el swing?
seticon java (3)
Aquí hay información útil que describe la transparencia de la imagen.
Su enfoque sería algo como esto:
- Defina un
Timer
oscilación paraActionEvent
unActionEvent
deActionEvent
en el hilo de envío de evento cada N milisegundos. - Agregue un
ActionListener
alTimer
que debe llamar arepaint()
en suComponent
contiene laImage
. - Reemplace el método
paintComponent(Graphics)
delComponent
para hacer lo siguiente:- Emitir el objeto
Graphics
a unGraphics2D
. - Establezca un
AlphaComposite
enGraphics2D
usandosetComposite
. Esto controla el nivel de transparencia. - Dibuja la imagen.
- Emitir el objeto
Para cada iteración de su animación de fundido de salida, cambiaría los valores de AlphaComposite
para que la imagen sea más transparente.
Tengo clase que hereda de JPanel con una imagen y quiero configurar una pequeña animación para mostrar el panel / imagen y luego fundirla cuando se dispara un evento.
Presumiblemente configuré un hilo y desencadené la animación, pero ¿cómo hago el desvanecimiento?
Aquí hay un ejemplo usando transparencia alfa. Puede usar 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);
}
});
}
}
Puede hacer el enhebrado usted mismo, pero podría ser más fácil usar la biblioteca Trident para manejarlo. Si crea un setter en su clase llamado (digamos, setOpacity
), puede pedirle a Trident que interpole el campo "opacidad" de 1.0 a 0.0 durante un período de tiempo específico (aquí hay algunos de los documentos sobre cómo usar Trident).
Cuando está pintando la imagen, puede hacer la transparencia con un AlphaComposite
, utilizando el valor de "opacidad" actualizado para el parámetro alfa del compuesto. Hay un tutorial de Sun que incluye un ejemplo alfa compuesto .