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

2014-11-24 03:21:37 · 作者: · 浏览: 2
//5. 需要注意的是tx3.rotate(-Math.PI / 4) 方法不需要再被调用了,因为

124 //setTransform并不和之前的变换组合。

125 tx3.translate(480, getHeight()/2);

126 tx3.scale(1.5, 1.5);

127 g2d.setTransform(tx3);

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

129 //6. 切变变换,为了保持和其他泳道显示的结果一致,这里需要重新设定scale变换

130 AffineTransform tx4 = new AffineTransform();

131 tx4.translate(720, getHeight()/2);

132 tx4.shear(0.5, 0);

133 tx4.scale(1.5, 1.5);

134 g2d.setTransform(tx4);

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

136 g2d.setTransform(oldTrans);

137 }

138 //通过AffineTransform的静态工厂方法获取AffineTransform的具体子类

139 //再通过已经设定好变换的AffineTransform和形状的原始坐标生成目标

140 //形状,由于目标形状中已经是变换后的形状,因此Graphics2D可以直接渲染即可

141 private void paintWithStaticTransformInstance(Graphics g) {

142 Graphics2D g2d = (Graphics2D) g;

143 AffineTransform oldTrans = g2d.getTransform();

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

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

146 g2d.translate(0, getHeight()*3/4);

147 g2d.setColor(Color.green);

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

149 AffineTransform tx1 = AffineTransform.getTranslateInstance(160, 0);

150 Rectangle rect = new Rectangle(20, 20, 60, 60);

151 Shape newShape = tx1.createTransformedShape(rect);

152 g2d.fill(newShape);

153 //2. 由于是直接通过Graphics2D渲染目标形状,因此这些变换并没有在

154 //Graphics2D中进行过组合,因此每次变换都是独立的变换,需要指定

155 //距离原始坐标的绝对距离

156 AffineTransform tx2 = AffineTransform.getTranslateInstance(320, 0);

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

158 newShape = tx2.createTransformedShape(rect);

159 g2d.fill(newShape);

160

161 AffineTransform tx3 = AffineTransform.getTranslateInstance(480, 0);

162 tx3.scale(1.5, 1.5);

163 newShape = tx3.createTransformedShape(rect);

164 g2d.fill(newShape);

165

166 AffineTransform tx4 = AffineTransform.getTranslateInstance(720, 0);

167 tx4.scale(1.5, 1.5);

168 tx4.shear(0.5, 0);

169 newShape = tx4.createTransformedShape(rect);

170 g2d.fill(newShape);

171 g2d.setTransform(oldTrans);

172 }

173 }

6. 剪切:

通过在图形上下文中设置一个剪切形状,可以将所有的绘图操作限制在该剪切形状内部来进行,如:

g2.setClip(clipShape);

g2.draw(Shape);

setClip()方法和坐标变换中setTransform()方法有一个非常重要的相似之处,他们都会直接替换Graphics中已有的坐标变换或剪切区域。鉴于此,Java 2D 在剪切中同样提供了另一个方法clip(),该方法和坐标变换中的transform等方法相似,会将当前的剪切区域和已有的剪切区域进行合并,并形成新的剪切区域,如:g2.clip(clipShape)。

1 public class MyTest extends JPanel {

2 public static void main(String[] args) {

3 JFrame frame = new JFrame();

4 frame.setTitle("Clip");

5 frame.setSize(600, 600);

6 frame.addWindowListener(new WindowAdapter() {

7 public void windowClosing(WindowEvent e) {

8 System.exit(0);

9 }

10 });

11 Container co