12 contentPane.add(new MyTest());
13 frame.show();
14 }
15 public void paintComponent(Graphics g) {
16 super.paintComponent(g);
17 g.setColor(Color.orange);
18 g.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);
19 paintClipRectangle(g);
20 }
21 private void paintClipRectangle(Graphics g) {
22 Graphics2D g2 = (Graphics2D) g;
23 int w = getWidth();
24 int h = getHeight() / 2;
25 //设定裁剪区域为当前的椭圆,由于使用的setClip,因此不会和Graphics中
26 //已经设定的clip进行组合。
27 Ellipse2D e = new Ellipse2D.Float(w / 4.0f, h / 4.0f, w / 2.0f, h / 2.0f);
28 g2.setClip(e);
29 g2.setColor(Color.yellow);
30 g2.fillRect(0, 0, w, h);
31 //打印出当前剪切区域的矩形边界,这里的bounds为椭圆剪切区域的外切矩形
32 System.out.println(g2.getClipBounds());
33 e = new Ellipse2D.Float(w / 4.0f, h / 4.0f + h, w / 2.0f, h / 2.0f);
34 g2.setClip(e);
35 g2.setColor(Color.green);
36 g2.fillRect(0, h, w, h);
37 System.out.println("Before clip: " + g2.getClipBounds());
38 //和Graphics中已经存在的剪切区域组合,取两个剪切区域的交集。
39 //如果没有交集,则无法绘制任何形状。
40 Rectangle r = new Rectangle(w / 2, h , w / 2, h );
41 g2.clip(r);
42 g2.setColor(Color.blue);
43 g2.fillRect(0, h, w, h);
44 System.out.println("After clip: " + g2.getClipBounds());
45 }
46 }
7. 透明与组合:
在标准RGB颜色模型中,每种颜色都是由红、绿和蓝这三种成分来描述的。用它来描述透明或者部分透明的图像区域也是非常方便的。在Java 2D 中,透明是由一个透明通道来描述的。每个像素,除了它的红、绿和蓝色部分外,还有一个介于0(完全透明)和1(完全不透名)之间的透明度(alpha)值。当两个形状重叠在一起时,必须把源像素和目标像素的颜色和透明度值混合或者组合起来。Java 2D中提供了12中组合方式,而我们这里只是介绍缺省情况下的SRC_OVER原则。
Alpha_D:目标形状的Alpha值
Alpha_S:源形状的Alpha值
在进行混合计算时,源像素颜色的权值为Alpha_S, 目标像素颜色的权值为(1 - Alpha_S) * Alpha_D。
在Java 2D中可以通过Graphics2D.setComposite()方法设定组合接口。该接口的具体实现类可以通过AlphaComposite提供的一组静态工厂方法获取,如:
1 public void paint(Graphics g) {
2 int rule = AlphaComposite.SRC_OVER;
3 float alpha = 0.5f;
4 Graphics2D g2 = (Graphics2D)g;
5 g2.setComposite(AlphaComposite.getInstance(rule,alpha));
6 g2.setPaint(Color.blue);
7 g2.fill(new Rectangle2D.Double(2.0,2.0,10.0.10.0));
8 }
上面代码中应用的组合原则是SRC_OVER,透明度是0.5。
1 public class MyTest extends JPanel {
2 public static void main(String[] args) {
3 JFrame frame = new JFrame();
4 frame.setTitle("Composition");
5 frame.setSize(400, 120);
6 frame.addWindowListener(new WindowAdapter() {
7 public void windowClosing(WindowEvent e) {
8 System.exit(0);
9 }
10 });
11 Container contentPane = frame.getContentPane();
12 contentPane.add(new MyTest());
13 frame.show();
14 }
15 public void paintComponent(Graphics g) {
16 super.paintComponent(g);
17 Graphics2D g2d = (Graphics2D) g;
18 //获取一个组合原则为SRC_OVER,透明度为0.5的AlphaComposite
19 //可以通过修改不同