package com.quiltplayer.view.swing.effects; import java.awt.AlphaComposite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JComponent; import net.miginfocom.swing.MigLayout; import org.springframework.stereotype.Component; import com.quiltplayer.external.covers.model.LocalImage; import com.quiltplayer.external.covers.util.ImageUtils; import com.quiltplayer.view.swing.ColorConstantsDark; @Component public class CrossFader extends JComponent implements ActionListener { private static final long serialVersionUID = 1L; private javax.swing.Timer animator; private List<ImageIcon> icons; private ImageIcon[] icon; private float alpha = 0; private int counter = 0; private int width; private boolean fetchedImages; public CrossFader() { setLayout(new MigLayout("fill")); } public void startAnimation() { if (animator == null) animator = new javax.swing.Timer(100, this); alpha = 0; counter = 0; nextIcons(); animator.setInitialDelay(4000); animator.restart(); } public void setImages(final List<LocalImage> images) { fetchedImages = false; counter = 0; icon = new ImageIcon[2]; icons = new ArrayList<ImageIcon>(); new Thread() { /* * (non-Javadoc) * * @see java.lang.Thread#run() */ @Override public void run() { for (LocalImage image : images) { ImageIcon tmp = new ImageIcon(image.getLargeImage().getAbsolutePath()); icons.add(ImageUtils.scalePicture(tmp, width)); } fetchedImages = true; startAnimation(); repaint(); } }.start(); } public void paintComponent(Graphics g) { if (width != getWidth()) width = getWidth(); if (fetchedImages) { if (width > 0) { if (icons != null && icons.size() > 0) { Graphics2D g2d = (Graphics2D) g; if (icons.size() > 1) { g2d.setPaint(ColorConstantsDark.PLAYLIST_BACKGROUND); g2d.fillRect(0, 0, getWidth(), getHeight()); if (alpha < 10) { alpha = alpha + 0.5f; } else { animator.stop(); nextIcons(); alpha = 0; animator.restart(); } g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f - alpha * 0.1f)); g2d.drawImage(icon[0].getImage(), 0, 0, (int) icon[0].getIconWidth(), icon[0].getIconHeight(), this); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha * 0.1f)); g2d.drawImage(icon[1].getImage(), 0, 0, (int) icon[1].getIconWidth(), (int) icon[1].getIconHeight(), this); } else { g2d.drawImage(icon[0].getImage(), 0, 0, (int) icon[0].getIconWidth(), (int) icon[0].getIconHeight(), this); } } } } } private void nextIcons() { if (icons != null && icons.size() > 0) { icon[0] = icons.get(counter); icon[1] = icons.get(getCounter()); } } private int getCounter() { counter++; if (icons.size() > counter) return counter; return counter = 0; } public void actionPerformed(ActionEvent e) { repaint(); } }