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