アニメアイコン

アニメーションするアイコンを作ってみる。

 ■ソースコード
 こんな感じ。

package test;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class AnimeIconTest extends JComponent implements Icon{
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private final Timer timer;
	private final List<Shape> list;
	private final Stroke stroke=new BasicStroke(2.0f);
	private final int ICON_SIZE=32;

	public AnimeIconTest() {
		super();
		list=new ArrayList<Shape>();
		Shape line=new Line2D.Double(0.0,8.0,0.0,14.0);
		AffineTransform rot=AffineTransform.getRotateInstance(Math.toRadians(30.0));
		AffineTransform trans=AffineTransform.getTranslateInstance(ICON_SIZE/2.0, ICON_SIZE/2.0);
		for(int i=0;i<12;i++){
			line=rot.createTransformedShape(line);
			list.add(trans.createTransformedShape(line));
		}
		setPreferredSize(new Dimension(ICON_SIZE, ICON_SIZE));
		ActionListener action=new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				list.add(list.remove(0));
				repaint();
			}
		};
		timer = new Timer(100,action);
	}

	public void start() {
		timer.start();
	}

	public void stop() {
		timer.stop();
		repaint();
	}

	public boolean isRunning(){
		return timer.isRunning();
	}

	@Override
	public void paintComponent(Graphics g) {
		Graphics2D g2=(Graphics2D)g;
		g2.setColor(getBackground());
		g2.fillRect(0,0,getWidth(),getHeight());
		g2.setStroke(stroke);
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		Iterator<Shape> it = list.iterator();
		if(timer.isRunning()) {
			float alpha=0.083f;
			while(it.hasNext()) {
				g2.setColor(new Color(0.6f,0.6f,0.6f,alpha));
				g2.draw((Shape)it.next());
				alpha +=0.083f;
			}
		}else{
			while(it.hasNext()) {
				g2.setColor(new Color(0.6f,0.6f,0.6f));
				g2.draw((Shape)it.next());
			}
		}
	}

	@Override
	public int getIconHeight() {
		return ICON_SIZE;
	}

	@Override
	public int getIconWidth() {
		return ICON_SIZE;
	}

	@Override
	public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3) {
		SwingUtilities.paintComponent(arg1,this,
				(Container)arg0,new Rectangle(arg2,arg3,ICON_SIZE,ICON_SIZE));
	}

	public static void main(String[] args){
		JFrame f=new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.getContentPane().setLayout(new BorderLayout());
		final AnimeIconTest icon=new AnimeIconTest();
		f.getContentPane().add(icon,BorderLayout.CENTER);
		JButton button=new JButton("On/Off");
		button.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if(icon.isRunning()){
					icon.stop();
				}else{
					icon.start();
				}
			}
		});
		f.getContentPane().add(button,BorderLayout.EAST);
		f.setSize(180,70);
		f.setVisible(true);
	}
}

 ■結果
 回ります。