Step By Step(Java 2D图形篇<二>) (五)

2014-11-24 03:21:37 · 作者: · 浏览: 16
ntentPane = frame.getContentPane();

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 //可以通过修改不同