Java-Gaming.org
Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars!
Featured games (78)
games approved by the League of Dukes
Games in Showcase (406)
games submitted by our members
Games in WIP (292)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Bubble-fade swing effect  (Read 2561 times)
0 Members and 1 Guest are viewing this topic.
Offline Juriy

Junior Member





« Posted 2008-09-25 10:16:41 »

Well, here's a little Swing effect that I'd like to share.
Brief: Animation effect to smoothly change components on the form.
Motivation: When you're changing components in a usual way (remove, add, revalidate), there's no visual connection between changing components: one of them just disappear, and another appear on its place.

Example: http://voituk.kiev.ua/demo/ws/fade/fade.jnlp
Sources: in post attachment

Explanation.
First thing I do after user presses "Test Fade" key is create a new BufferedImage same size as visible component and render that component to image (we create a "screenshot" of the component):

1  
2  
3  
4  
5  
6  
7  
tableImage = new BufferedImage(
      scrollPane.getWidth(),
      scrollPane.getHeight(),
      BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) tableImage.getGraphics();
scrollPane.paint(g);
g.dispose();


Now, when we have a screenshot we can apply some effects to it. I've applied Gaussian Blur. I took the code that calculates the Kernel of ConvolveOp from Filthy Rich Clients (great book, BTW).

1  
tableImage = getGaussianBlurFilter(3, false).filter(tableImage, null);


Now we have a blurred screenshot. I put a screenshot on a separate component and place it _instead_ of original component on a LayeredPane. On a "lower" layer I put the form that I'm going to show:

1  
2  
3  
4  
5  
6  
7  
8  
// Settings screen is what appears under the table
SettingsScreen settings = new SettingsScreen();
settings.setBounds(0, 0, scrollPane.getWidth(), scrollPane.getHeight());
layeredPane.add(settings, new Integer(10));
   
layeredPane.add(imageComponent, new Integer(20));
add(layeredPane, BorderLayout.CENTER);
revalidate();


Now everything is ready to start animation. I use TimingFramework to save time writing thread-handling code. You can do the same with plain threads if you don't want to include additional libraries to your project.

Here's what I do in the animation loop. I use AlphaCompolite.Clear to make a transparent "hole" in the image, and then repaint image component. Here's the code:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
   private void drawHoles(Graphics2D g) {
      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
     
      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

      for (int i = 0; i < drops.length; i++) {
         g.setColor(Color.GRAY);
         g.drawOval(
               drops[i].x - radiuses[i]/2,
               drops[i].y - radiuses[i]/2,
               radiuses[i],
               radiuses[i]);
      }

      g.setComposite(AlphaComposite.Clear);
      for (int i = 0; i < drops.length; i++)
         g.fillOval(
               drops[i].x - radiuses[i]/2,
               drops[i].y - radiuses[i]/2,
               radiuses[i],
               radiuses[i]);
   }

That's it. This was a quick experiment, so there are some more things to consider for production: clear the resources used, think what will happen if user resizes screen during animation (well, the probability of such action is really low, but you know those users), and finally put resulting component directly on the frame (get rid of LayeredPane that was used for animation only).

P.S. Don't look at the components functionality (those "detect proxy"). I've taken the first component that was suitable to show the idea.

http://voituk.kiev.ua - java tutorials, tips and tricks (Russian)
Offline noblemaster

JGO Ninja


Medals: 15
Projects: 7


Age of Conquest makes your day!


« Reply #1 - Posted 2008-09-25 13:15:47 »

That's great, thanks  Grin

I am planning to give it a try later today!!!

Offline Eli Delventhal
« League of Dukes »

JGO Kernel


Medals: 39
Projects: 12


Game Engineer


« Reply #2 - Posted 2008-09-25 17:21:54 »

I like! Glad you've graduated from a "does this work" thread to a "check this out" thread.  Grin

See my work:
OTC Software
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

Play Revenge of the Titans! The situation is critical. We need fancy commanders to defend Earth, the moon, Mars!
 
Browse for soundtracks for your game!

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

The invasion has landed! On Mars! And you're there to beat 'em!
cubemaster21 (67 views)
2013-05-17 21:29:12

alaslipknot (76 views)
2013-05-16 21:24:48

gouessej (109 views)
2013-05-16 00:53:38

gouessej (104 views)
2013-05-16 00:17:58

theagentd (115 views)
2013-05-15 15:01:13

theagentd (104 views)
2013-05-15 15:00:54

StreetDoggy (149 views)
2013-05-14 15:56:26

kutucuk (172 views)
2013-05-12 17:10:36

kutucuk (170 views)
2013-05-12 15:36:09

UnluckyDevil (179 views)
2013-05-12 05:09:57
Complex number cookbook
by Roquen
2013-04-24 12:47:31

2D Dynamic Lighting
by Oskuro
2013-04-17 16:46:12

2D Dynamic Lighting
by Oskuro
2013-04-17 16:45:57

2D Dynamic Lighting
by Oskuro
2013-04-17 16:23:20

Noise (bandpassed white)
by Roquen
2013-04-05 17:36:01

Noise (bandpassed white)
by Roquen
2013-04-03 16:17:38

Java Data structures
by Roquen
2013-03-29 13:21:12

Topic Request
by kutucuk
2013-03-22 21:42:01
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!
Page created in 0.181 seconds with 20 queries.