¿Cómo desvanezco una imagen en swing?

Resuelto blank asked hace 14 años • 3 respuestas

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?

blank avatar Feb 09 '10 18:02 blank
Aceptado

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 .

Ash avatar Feb 09 '2010 12:02 Ash

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.

imagen

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);
            }
        });
    }
}
trashgod avatar Feb 10 '2010 02:02 trashgod

Aquí encontrará información útil que describe la transparencia de la imagen .

Su enfoque sería algo como esto:

  • Defina un Swing Timerpara activar un ActionEventhilo en el envío de eventos cada N milisegundos.
  • Agregue un ActionListeneral Timerque debería invocar repaint()el Componentque contiene el archivo Image.
  • Anule el método Componentde paintComponent(Graphics)para hacer lo siguiente:
    • Lanza el Graphicsobjeto a un Graphics2D.
    • Establezca un AlphaCompositeuso Graphics2D. setCompositeEsto controla el nivel de transparencia.
    • Dibuja la imagen.

Para cada iteración de su animación de desvanecimiento, cambiaría los valores de AlphaCompositepara hacer la imagen más transparente.

Adamski avatar Feb 09 '2010 12:02 Adamski