Java-Gaming.org    
Featured games (79)
games approved by the League of Dukes
Games in Showcase (477)
Games in Android Showcase (107)
games submitted by our members
Games in WIP (535)
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 3113 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: 20
Projects: 10


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

JGO Kernel


Medals: 42
Projects: 11
Exp: 10 years


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.

 

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

The first screenshot will be displayed as a thumbnail.

Riven (7 views)
2014-07-29 12:53:52

Dwinin (7 views)
2014-07-29 10:59:34

E.R. Fleming (23 views)
2014-07-29 03:07:13

E.R. Fleming (9 views)
2014-07-29 03:06:25

pw (39 views)
2014-07-24 01:59:36

Riven (39 views)
2014-07-23 21:16:32

Riven (26 views)
2014-07-23 21:07:15

Riven (28 views)
2014-07-23 20:56:16

ctomni231 (59 views)
2014-07-18 06:55:21

Zero Volt (51 views)
2014-07-17 23:47:54
HotSpot Options
by dleskov
2014-07-08 03:59:08

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:58:24

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:47:22

How do I start Java Game Development?
by ra4king
2014-05-17 11:13:37

HotSpot Options
by Roquen
2014-05-15 09:59:54

HotSpot Options
by Roquen
2014-05-06 15:03:10

Escape Analysis
by Roquen
2014-04-29 22:16:43

Experimental Toys
by Roquen
2014-04-28 13:24:22
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
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!