KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > java2d > demos > Composite > FadeAnim


1 /*
2  * @(#)FadeAnim.java 1.42 06/08/29
3  *
4  * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * -Redistribution of source code must retain the above copyright notice, this
10  * list of conditions and the following disclaimer.
11  *
12  * -Redistribution in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution.
15  *
16  * Neither the name of Sun Microsystems, Inc. or the names of contributors may
17  * be used to endorse or promote products derived from this software without
18  * specific prior written permission.
19  *
20  * This software is provided "AS IS," without a warranty of any kind. ALL
21  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
22  * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
23  * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
24  * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
25  * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
26  * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
27  * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
28  * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
29  * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
30  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
31  *
32  * You acknowledge that this software is not designed, licensed or intended
33  * for use in the design, construction, operation or maintenance of any
34  * nuclear facility.
35  */

36
37 /*
38  * @(#)FadeAnim.java 1.42 06/08/29
39  */

40
41 package java2d.demos.Composite;
42
43 import static java.awt.Color JavaDoc.*;
44 import java.awt.*;
45 import java.awt.geom.*;
46 import java.awt.image.*;
47 import java.awt.event.*;
48 import java.util.Vector JavaDoc;
49 import javax.swing.*;
50 import javax.swing.event.*;
51 import javax.swing.border.*;
52 import java2d.AnimatingControlsSurface;
53 import java2d.CustomControls;
54
55
56
57 /**
58  * Animation of compositing shapes, text and images fading in and out.
59  */

60 public class FadeAnim extends AnimatingControlsSurface {
61
62     private static TexturePaint texture;
63     static {
64         int w = 10; int h = 10;
65         BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
66         Graphics2D gi = bi.createGraphics();
67         Color JavaDoc oc = BLUE; Color JavaDoc ic = GREEN;
68         gi.setPaint(new GradientPaint(0,0,oc,w*.35f,h*.35f,ic));
69         gi.fillRect(0, 0, w/2, h/2);
70         gi.setPaint(new GradientPaint(w,0,oc,w*.65f,h*.35f,ic));
71         gi.fillRect(w/2, 0, w/2, h/2);
72         gi.setPaint(new GradientPaint(0,h,oc,w*.35f,h*.65f,ic));
73         gi.fillRect(0, h/2, w/2, h/2);
74         gi.setPaint(new GradientPaint(w,h,oc,w*.65f,h*.65f,ic));
75         gi.fillRect(w/2, h/2, w/2, h/2);
76         texture = new TexturePaint(bi,new Rectangle(0,0,w,h));
77     }
78     private static BasicStroke bs = new BasicStroke(6);
79     private static Font fonts[] = {
80                 new Font("Times New Roman", Font.PLAIN, 64),
81                 new Font("serif", Font.BOLD + Font.ITALIC, 24),
82                 new Font("Courier", Font.BOLD, 36),
83                 new Font("Arial", Font.BOLD + Font.ITALIC, 48),
84                 new Font("Helvetica", Font.PLAIN, 52)};
85     private static String JavaDoc strings[] = {
86                 "Alpha", "Composite", "Src", "SrcOver",
87                 "SrcIn", "SrcOut", "Clear", "DstOver", "DstIn" };
88     private static String JavaDoc imgs[] = {
89                 "jumptojavastrip.png", "duke.gif", "star7.gif" };
90     private static Paint paints[] = {
91                 RED, BLUE, GREEN, MAGENTA,
92                 ORANGE, PINK, CYAN, texture,
93                 YELLOW, LIGHT_GRAY, WHITE};
94     private Vector JavaDoc vector = new Vector JavaDoc(20);
95     private int numShapes, numStrings, numImages;
96
97
98     public FadeAnim() {
99         setBackground(BLACK);
100         setStrings(2);
101         setImages(3);
102         setShapes(8);
103         setControls(new Component[] { new DemoControls(this) });
104         setConstraints(new String JavaDoc[] { BorderLayout.EAST });
105     }
106
107
108     public void setImages(int num) {
109
110         if (num < numImages) {
111             Vector JavaDoc v = new Vector JavaDoc(vector.size());
112             for (int i = 0; i < vector.size(); i++) {
113                 if (((ObjectData) vector.get(i)).object instanceof Image) {
114                     v.addElement(vector.get(i));
115                 }
116             }
117             vector.removeAll(v);
118             v.setSize(num);
119             vector.addAll(v);
120         } else {
121             Dimension d = getSize();
122             for (int i = numImages; i < num; i++) {
123                 Object JavaDoc obj = getImage(imgs[i % imgs.length]);
124                 if (imgs[i % imgs.length].equals("jumptojavastrip.png")) {
125                     int iw = ((Image) obj).getWidth(null);
126                     int ih = ((Image) obj).getHeight(null);
127                     BufferedImage bimg = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
128                     bimg.createGraphics().drawImage((Image) obj, 0, 0, null);
129                     obj = bimg;
130                 }
131                 ObjectData od = new ObjectData(obj, BLACK);
132                 od.reset(d.width, d.height);
133                 vector.addElement(od);
134             }
135         }
136         numImages = num;
137     }
138         
139
140     public void setStrings(int num) {
141
142         if (num < numStrings) {
143             Vector JavaDoc v = new Vector JavaDoc(vector.size());
144             for (int i = 0; i < vector.size(); i++) {
145                 if (((ObjectData) vector.get(i)).object instanceof TextData) {
146                     v.addElement(vector.get(i));
147                 }
148             }
149             vector.removeAll(v);
150             v.setSize(num);
151             vector.addAll(v);
152         } else {
153             Dimension d = getSize();
154             for (int i = numStrings; i < num; i++) {
155                 int j = i % fonts.length;
156                 int k = i % strings.length;
157                 Object JavaDoc obj = new TextData(strings[k], fonts[j], this);
158                 ObjectData od = new ObjectData(obj, paints[i%paints.length]);
159                 od.reset(d.width, d.height);
160                 vector.addElement(od);
161             }
162         }
163         numStrings = num;
164     }
165         
166
167     public void setShapes(int num) {
168
169         if (num < numShapes) {
170             Vector JavaDoc v = new Vector JavaDoc(vector.size());
171             for (int i = 0; i < vector.size(); i++) {
172                 if (((ObjectData) vector.get(i)).object instanceof Shape) {
173                     v.addElement(vector.get(i));
174                 }
175             }
176             vector.removeAll(v);
177             v.setSize(num);
178             vector.addAll(v);
179         } else {
180             Dimension d = getSize();
181             for (int i = numShapes; i < num; i++) {
182                 Object JavaDoc obj = null;
183                 switch (i % 7) {
184                     case 0 : obj = new GeneralPath(); break;
185                     case 1 : obj = new Rectangle2D.Double(); break;
186                     case 2 : obj = new Ellipse2D.Double(); break;
187                     case 3 : obj = new Arc2D.Double(); break;
188                     case 4 : obj = new RoundRectangle2D.Double(); break;
189                     case 5 : obj = new CubicCurve2D.Double(); break;
190                     case 6 : obj = new QuadCurve2D.Double(); break;
191                 }
192                 ObjectData od = new ObjectData(obj, paints[i%paints.length]);
193                 od.reset(d.width, d.height);
194                 vector.addElement(od);
195             }
196         }
197         numShapes = num;
198     }
199
200
201     public void reset(int w, int h) {
202         for (int i = 0; i < vector.size(); i++) {
203             ((ObjectData) vector.get(i)).reset(w, h);
204         }
205     }
206
207
208     public void step(int w, int h) {
209         for (int i = 0; i < vector.size(); i++) {
210             ((ObjectData) vector.get(i)).step(w, h);
211         }
212     }
213
214
215     public void render(int w, int h, Graphics2D g2) {
216         for (int i = 0; i < vector.size(); i++) {
217             ObjectData od = (ObjectData) vector.get(i);
218             AlphaComposite ac = AlphaComposite.getInstance(
219                                    AlphaComposite.SRC_OVER, od.alpha);
220             g2.setComposite(ac);
221             g2.setPaint(od.paint);
222             g2.translate(od.x, od.y);
223
224             if (od.object instanceof Image) {
225                 g2.drawImage((Image) od.object, 0, 0, this);
226             } else if (od.object instanceof TextData) {
227                 g2.setFont(((TextData) od.object).font);
228                 g2.drawString(((TextData) od.object).string, 0, 0);
229             } else if (od.object instanceof QuadCurve2D
230                     || od.object instanceof CubicCurve2D)
231             {
232                 g2.setStroke(bs);
233                 g2.draw((Shape) od.object);
234             } else if (od.object instanceof Shape) {
235                 g2.fill((Shape) od.object);
236             }
237             g2.translate(-od.x, -od.y);
238         }
239     }
240
241
242     public static void main(String JavaDoc argv[]) {
243         createDemoFrame(new FadeAnim());
244     }
245
246
247     static class TextData extends Object JavaDoc {
248
249     public String JavaDoc string;
250         public Font font;
251         public int width, height;
252
253         public TextData(String JavaDoc str, Font font, Component cmp) {
254             string = str;
255             this.font = font;
256             FontMetrics fm = cmp.getFontMetrics(font);
257             width = fm.stringWidth(str);
258             height = fm.getHeight();
259         }
260     }
261
262
263     static class ObjectData extends Object JavaDoc {
264         final int UP = 0;
265         final int DOWN = 1;
266         Object JavaDoc object;
267         BufferedImage bimg;
268         Paint paint;
269         double x, y;
270         float alpha;
271         int alphaDirection;
272         int imgX;
273
274         public ObjectData(Object JavaDoc object, Paint paint) {
275             this.object = object;
276             this.paint = paint;
277             if (object instanceof BufferedImage) {
278                 bimg = (BufferedImage) object;
279                 this.object = bimg.getSubimage(0, 0, 80, 80);
280             }
281             getRandomXY(300, 250);
282             alpha = (float) Math.random();
283             alphaDirection = Math.random() > 0.5 ? UP : DOWN;
284         }
285
286
287         private void getRandomXY(int w, int h) {
288             if (object instanceof TextData) {
289                 x = Math.random() * (w - ((TextData) object).width);
290                 y = Math.random() * h;
291                 y = y < ((TextData) object).height ? ((TextData) object).height : y;
292             } else if (object instanceof Image) {
293                 x = Math.random() * (w - ((Image) object).getWidth(null));
294                 y = Math.random() * (h - ((Image) object).getHeight(null));
295             } else if (object instanceof Shape) {
296                 Rectangle bounds = ((Shape) object).getBounds();
297                 x = Math.random() * (w - bounds.width);
298                 y = Math.random() * (h - bounds.height);
299             }
300         }
301
302
303         public void reset(int w, int h) {
304             getRandomXY(w, h);
305             double ww = 20 + Math.random()*((w == 0 ? 400 : w)/4);
306             double hh = 20 + Math.random()*((h == 0 ? 300 : h)/4);
307             if (object instanceof Ellipse2D) {
308                 ((Ellipse2D) object).setFrame(0, 0, ww, hh);
309             } else if (object instanceof Rectangle2D) {
310                 ((Rectangle2D) object).setRect(0, 0, ww, ww);
311             } else if (object instanceof RoundRectangle2D) {
312                 ((RoundRectangle2D) object).setRoundRect(0, 0, hh, hh, 20, 20);
313             } else if (object instanceof Arc2D) {
314                 ((Arc2D) object).setArc(0, 0, hh, hh, 45, 270, Arc2D.PIE);
315             } else if (object instanceof QuadCurve2D) {
316                 ((QuadCurve2D) object).setCurve(0, 0, w*.2, h*.4, w*.4, 0);
317             } else if (object instanceof CubicCurve2D) {
318                     ((CubicCurve2D) object).setCurve(0,0,30,-60,60,60,90,0);
319             } else if (object instanceof GeneralPath) {
320                 GeneralPath p = new GeneralPath();
321                 float size = (float) ww;
322                 p.moveTo(- size / 2.0f, - size / 8.0f);
323                 p.lineTo(+ size / 2.0f, - size / 8.0f);
324                 p.lineTo(- size / 4.0f, + size / 2.0f);
325                 p.lineTo(+ 0.0f, - size / 2.0f);
326                 p.lineTo(+ size / 4.0f, + size / 2.0f);
327                 p.closePath();
328                 object = p;
329             }
330         }
331
332
333         public void step(int w, int h) {
334             if (object instanceof BufferedImage) {
335                 if ((imgX += 80) == 800) {
336                     imgX = 0;
337                 }
338                 object = bimg.getSubimage(imgX, 0, 80, 80);
339             }
340             if (alphaDirection == UP) {
341                 if ((alpha += 0.05) > .99) {
342                     alphaDirection = DOWN;
343                     alpha = 1.0f;
344                 }
345             } else if (alphaDirection == DOWN) {
346                 if ((alpha -= .05) < 0.01) {
347                     alphaDirection = UP;
348                     alpha = 0;
349                     getRandomXY(w, h);
350                 }
351             }
352         }
353     }
354
355
356     static class DemoControls extends CustomControls implements ChangeListener {
357
358         FadeAnim demo;
359         JSlider shapeSlider, stringSlider, imageSlider;
360         Font font = new Font("serif", Font.BOLD, 10);
361
362         public DemoControls(FadeAnim demo) {
363             super(demo.name);
364             this.demo = demo;
365             setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
366             add(Box.createVerticalStrut(5));
367
368             JToolBar toolbar = new JToolBar(JToolBar.VERTICAL);
369             toolbar.setFloatable(false);
370             shapeSlider = new JSlider(JSlider.HORIZONTAL,0,20,demo.numShapes);
371             shapeSlider.addChangeListener(this);
372             TitledBorder tb = new TitledBorder(new EtchedBorder());
373             tb.setTitleFont(font);
374             tb.setTitle(String.valueOf(demo.numShapes) + " Shapes");
375             shapeSlider.setBorder(tb);
376             shapeSlider.setPreferredSize(new Dimension(80,45));
377             shapeSlider.setOpaque(true);
378             toolbar.addSeparator();
379             toolbar.add(shapeSlider);
380             toolbar.addSeparator();
381
382             stringSlider = new JSlider(JSlider.HORIZONTAL,0,10,demo.numStrings);
383             stringSlider.addChangeListener(this);
384             tb = new TitledBorder(new EtchedBorder());
385             tb.setTitleFont(font);
386             tb.setTitle(String.valueOf(demo.numStrings) + " Strings");
387             stringSlider.setBorder(tb);
388             stringSlider.setPreferredSize(new Dimension(80,45));
389             stringSlider.setOpaque(true);
390             toolbar.add(stringSlider);
391             toolbar.addSeparator();
392
393             imageSlider = new JSlider(JSlider.HORIZONTAL,0,10,demo.numImages);
394             imageSlider.addChangeListener(this);
395             tb = new TitledBorder(new EtchedBorder());
396             tb.setTitleFont(font);
397             tb.setTitle(String.valueOf(demo.numImages) + " Images");
398             imageSlider.setBorder(tb);
399             imageSlider.setPreferredSize(new Dimension(80,45));
400             imageSlider.setOpaque(true);
401             toolbar.add(imageSlider);
402             toolbar.addSeparator();
403
404             add(toolbar);
405         }
406
407
408         public void stateChanged(ChangeEvent e) {
409             JSlider slider = (JSlider) e.getSource();
410             int value = slider.getValue();
411             TitledBorder tb = (TitledBorder) slider.getBorder();
412             if (slider.equals(shapeSlider)) {
413                 tb.setTitle(String.valueOf(value) + " Shapes");
414                 demo.setShapes(value);
415             } else if (slider.equals(stringSlider)) {
416                 tb.setTitle(String.valueOf(value) + " Strings");
417                 demo.setStrings(value);
418             } else if (slider.equals(imageSlider)) {
419                 tb.setTitle(String.valueOf(value) + " Images");
420                 demo.setImages(value);
421             }
422             slider.repaint();
423             if (demo.animating.thread == null) {
424                 demo.repaint();
425             }
426         }
427
428
429         public Dimension getPreferredSize() {
430             return new Dimension(80,0);
431         }
432
433
434         public void run() {
435             try {
436                thread.sleep(999);
437             } catch (InterruptedException JavaDoc e) { return; }
438             shapeSlider.setValue((int) (Math.random() * 5));
439             stringSlider.setValue(10);
440             thread = null;
441         }
442     } // End DemoControls
443
} // End FadeAnim
444
Popular Tags