1 36 37 40 41 package java2d.demos.Composite; 42 43 import static java.awt.Color .*; 44 import java.awt.*; 45 import java.awt.geom.*; 46 import java.awt.image.*; 47 import java.awt.event.*; 48 import java.util.Vector ; 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 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 oc = BLUE; Color 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 strings[] = { 86 "Alpha", "Composite", "Src", "SrcOver", 87 "SrcIn", "SrcOut", "Clear", "DstOver", "DstIn" }; 88 private static String 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 vector = new Vector (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 [] { BorderLayout.EAST }); 105 } 106 107 108 public void setImages(int num) { 109 110 if (num < numImages) { 111 Vector v = new Vector (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 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 v = new Vector (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 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 v = new Vector (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 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 argv[]) { 243 createDemoFrame(new FadeAnim()); 244 } 245 246 247 static class TextData extends Object { 248 249 public String string; 250 public Font font; 251 public int width, height; 252 253 public TextData(String 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 { 264 final int UP = 0; 265 final int DOWN = 1; 266 Object 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 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 e) { return; } 438 shapeSlider.setValue((int) (Math.random() * 5)); 439 stringSlider.setValue(10); 440 thread = null; 441 } 442 } } | Popular Tags |