/* アニメーション実験 Ver 0.10 */ /* */ /* */ /* by Atsushi 2005/8/20 */ package animation.animation; import java.awt.*; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import net.antun.lib.awt.image.WaveImageFilter; import animation.Animation; public class PreFilteringAnimation extends Animation implements Runnable { /* --- Field --- */ private Thread loop=null; private boolean stop; private Image[] image; /* --- Constructor --- */ public PreFilteringAnimation(Image baseImage) { super(baseImage); } /* --- 初期化 --- */ private void initImage() { WaveImageFilter filter; MediaTracker tracker; double k; int x,y; tracker=new MediaTracker(component); image=new Image[24*4]; for (int frame=0;frame<=image.length-1;frame++) { k=((double)(frame%(24*4)))/(24*4); filter=new WaveImageFilter( 48,(int)(12-Math.abs(12-24*k)),-frame*Math.PI/5.0); image[frame]=component.createImage( new FilteredImageSource(baseImage.getSource(),filter)); tracker.addImage(image[frame],frame); try {tracker.waitForID(frame);} catch (InterruptedException e) { e.printStackTrace(); } if (stop) return; } } /* --- アニメーション --- */ public void startAnimation() { if (loop==null && component!=null) { stop=false; loop=new Thread(this,"Animation"); loop.start(); } } public void run() // loop { Graphics g; int counter; initImage(); counter=0; g=component.getGraphics(); component.paint(g); while (true) { if (stop) break; paintImage(counter++); component.update(g); if (stop) break; synchronized (this) { try {Thread.sleep(40);} catch (InterruptedException e) {} } } loop=null; } private void paintImage(int counter) { int frame; int x,y; frame=counter%image.length; x=baseImage.getWidth (null)/2-image[frame].getWidth (null)/2; y=baseImage.getHeight(null)/2-image[frame].getHeight(null)/2; g.drawImage(image[frame],x,y,null); } public void stopAnimation() { if (loop!=null) { stop=true; try {loop.join();} catch (InterruptedException e) {} for (int i=0;i<=image.length-1;i++) image[i].flush(); } } }