淡入:Fade in,指画面从100%透明逐渐变化到100%不透明,视觉效果就是渐渐出现;
淡出:Fade out,指画面从100%不透明逐渐变化到100%不透明,视觉效果就是渐渐消失;
J.UI : Java GUI,这里指的就是Java Swing组件。
本文讲述如何在Java Swing组件上实现淡入淡出的效果。
『基本原理』
该效果的基本原理是利用Java2D里面引入的AlphaComposite类来设置组件的图形定制方法JComponent.paintComponent(Graphics g)中g的透明度。Graphics这个类并没有AlphaComposite这个属性,因此,设置之前,要先把g转型成为一个Graphics2D的对象,然后可以用Graphics2D.setComposite(AlphaComposite comp)来设置透明度。一般来说,对于swing组件,如果要定制其图形,先把Graphics的对象转型成为Graphics2D的对象也是一个常用的技巧,以便利用Graphics2D中引入的一些方法。当然,要实现透明度的逐渐改变,还需要一个线程不断的对透明度进行设置,并且更新画面。
下面这段简单的代码表明如何利用线程和AlphaComposite来实现淡入的效果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FFrame extends JFrame {
private final FComponent fc = new FComponent();
private Image image = new ImageIcon("pudong.jpg").getImage(); // initialize some image here
class FComponent extends JComponent {
float alpha = 0.0f;
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
AlphaComposite comp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g2d.setComposite(comp);
g2d.drawImage(image, 0, 0, this);
}
}
class FController implements Runnable {
public void run() {
try {
Thread.sleep(500); // pause for 0.5 sec first
while (true) {
for (int i=0; i<=50; i++) {
fc.alpha = ((float) i) / 50;
Thread.sleep(50);
fc.repaint();
} // end for
} // end while
} catch (InterruptedException e) {
}
}
}
public FFrame() {
Dimension psize = new Dimension(640, 380); // set to some proper size to fit the image
fc.setPreferredSize(psize);
JPanel panel = new JPanel();
panel.add(fc);
this.getContentPane().add(panel);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(700, 440);
this.setLocationRelativeTo(null); // center on screen
this.addWindowListener(new WindowAdapter() {
public void windowOpened(WindowEvent e) {
new Thread(new FController()).start();
}
});
}
public static void main(String args[]) {
new FFrame().setVisible(true);
}
}
|
第10到第18行定义了一个FComponent的类,里面通过override JComponent的paintComponent的方法定制其图形。alpha是一个变量,在paintComponent里面被用到,控制图形的透明度。控制淡入淡出的线程(FController)就是通过改变alpha的值,然后调用repaint方法实现透明度的渐变的。这段是写在第20到到第34行的。控制线程是在主窗口第一次被打开(windowOpened event)时候被创建并开始执行的,见第50行。
由于FComponent是一个自定义的组件,所以最好设置(根据所用的LayoutManager)其preferredSize。
『FadeComponent』
笔者写了一个FadeComponent的类,extends JComponent implements Runnable,另外加入一些Bean Pattern的方法,也就是set/get一些淡入淡出的参数,比如循环次数,渐变的步骤数目等等。关于这个类的用法,笔者上传了一个demo的应用程序在附件中,是一个jar文件,用j2se1.4.2_05编译打包,包含源代码和class文件,可直接运行。如果由于JRE版本问题不能运行可以用解压缩软件提取出源代码编译运行。这个demo有详细的解释,并且包含有FadeComponent的API文档。 附件:FadeJUIDemo_1.4.2_05.jar(68K) |