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

2014-11-24 03:21:37 · 作者: · 浏览: 1
g2d.shear(0.5, 0);

52 g2d.fillRect(20, 20, 60, 60);

53 //7. 这里需要还原,否则会影响后面的变换

54 g2d.setTransform(oldTrans);

55 }

56 //该方法和paintWithGraphicsMethod机制是一致的,只是应用的方法改为

57 //AffineTransform提供的变换方法

58 private void paintWithTransform(Graphics g) {

59 Graphics2D g2d = (Graphics2D) g;

60 AffineTransform oldTrans = g2d.getTransform();

61 //1. 先将坐标系的原点移到第二个泳道中,以便后面的代码可以和其他

62 //函数中的代码保持一致

63 g2d.translate(0, getHeight()/4);

64 g2d.setColor(Color.red);

65 g2d.fillRect(20, 20, 60, 60);

66

67 AffineTransform tx1 = new AffineTransform();

68 tx1.translate(160, 0);

69 //2. 这里用到的transform方法在Graphics对象内部也是组合方式的,

70 //换句话说,后面的transform方法将会基于本次变化的结果。

71 g2d.transform(tx1);

72 g2d.fillRect(20, 20, 60, 60);

73

74 AffineTransform tx2 = new AffineTransform();

75 tx2.translate(160, 0);

76 tx2.rotate(Math.PI / 4);

77 //3. 本次transform将基于1)中transform的结果并进行组合

78 g2d.transform(tx2);

79 g2d.fillRect(20, 20, 60, 60);

80

81 AffineTransform tx3 = new AffineTransform();

82 //4. 这里的rotate的作用和上面的paintWithGraphicsMethod()方法的4)是一致的。

83 tx3.rotate(-Math.PI / 4);

84 tx3.translate(160, 0);

85 tx3.scale(1.5, 1.5);

86 g2d.transform(tx3);

87 g2d.fillRect(20, 20, 60, 60);

88 //5. 切变变换

89 AffineTransform tx4 = new AffineTransform();

90 tx4.shear(0.5, 0);

91 tx4.translate(160, 0);

92 g2d.transform(tx4);

93 g2d.fillRect(20, 20, 60, 60);

94 g2d.setTransform(oldTrans);

95 }

96 //通过setTransform方法基于绝对坐标进行变换

97 private void paintWithSetTransform(Graphics g) {

98 Graphics2D g2d = (Graphics2D) g;

99 AffineTransform oldTrans = g2d.getTransform();

100 //1. 先将坐标系的原点移到第三个泳道中,以便后面的代码可以和其他

101 //函数中的代码保持一致

102 g2d.translate(0, getHeight()/2);

103 g2d.setColor(Color.blue);

104 g2d.fillRect(20, 20, 60, 60);

105 AffineTransform tx1 = new AffineTransform();

106 //2. 由于setTransform方法是直接替换为参数中的变换对象,之前驻留在Graphics中的

107 //变换对象都不在起作用了,因此这里在平移时,需要基于最原始的(窗体左上角)原点坐标

108 //进行平移变换,可以理解为绝对平移变换。

109 //可以看到translate中的y参数是相对于最初原点的平移距离。

110 tx1.translate(160, getHeight()/2);

111 //3. 将g2d中的变换对象直接替换为参数对象。

112 g2d.setTransform(tx1);

113 g2d.fillRect(20, 20, 60, 60);

114

115 AffineTransform tx2 = new AffineTransform();

116 //4. 道理和上面的代码一样,可以看到这个时候x参数也设定为绝对距离了。

117 tx2.translate(320, getHeight()/2);

118 tx2.rotate(Math.PI / 4);

119 g2d.setTransform(tx2);

120 g2d.fillRect(20, 20, 60, 60);

121

122 AffineTransform tx3 = new AffineTransform();

123