Come faccio a sfumare un’immagine in oscillazione?

Ho una class che eredita da JPanel con un’immagine su di essa e voglio impostare una piccola animazione per visualizzare il pannello / immagine e poi svanire quando un evento si triggers.

Presumibilmente imposto un thread e sparo l’animazione, ma come faccio a fare la dissolvenza?

È ansible eseguire personalmente la filettatura, ma potrebbe essere più semplice utilizzare la libreria Trident per gestirla. Se crei un setter sulla tua class chiamato (ad esempio, setOpacity ), puoi chiedere al tridente di interpolare il campo “opacità” da 1.0 a 0.0 in un determinato periodo di tempo (ecco alcuni documenti su come usare Trident).

Quando AlphaComposite l’immagine, puoi fare la trasparenza con un AlphaComposite , usando il valore di “opacità” aggiornato per il parametro alfa del composito. Esiste un’esercitazione su Sun che include un esempio composito alfa .

Ecco un esempio usando la trasparenza alfa. È ansible utilizzare questo strumento composito per vedere il risultato dell’utilizzo di colors, modalità e alfa diversi.

Immagine

 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 actionPerformsd(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); } }); } } 

Ci sono alcune informazioni utili che descrivono la trasparenza dell’immagine qui .

Il tuo approccio sarebbe simile a questo:

  • Definisci un Timer Swing per ActionEvent un ActionEvent sul thread di Invio eventi ogni N millisecondi.
  • Aggiungi un ActionListener al Timer che dovrebbe chiamare repaint() sul tuo Component contiene l’ Image .
  • Sovrascrivere il metodo paintComponent(Graphics) per eseguire quanto segue:
    • Trasmetti l’object Graphics a Graphics2D .
    • Imposta un AlphaComposite su Graphics2D utilizzando setComposite . Questo controlla il livello di trasparenza.
    • Disegna l’immagine.

Per ogni iterazione della tua animazione di dissolvenza cambierai i valori di AlphaComposite per rendere l’immagine più trasparente.