アニメアイコン
アニメーションするアイコンを作ってみる。
■ソースコード
こんな感じ。
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); } }