Java 教程是针对 JDK 8 编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关 Java SE 9 及后续版本中更新的语言功能的摘要,请参阅 Java 语言更改。
有关所有 JDK 版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅 JDK 发行说明。
你可以通过修改Graphics2D
上下文中的transform属性来在渲染时移动、旋转、缩放和剪切图形元素。transform属性由AffineTransform
类的实例定义。仿射变换是一种变换,例如平移、旋转、缩放或剪切,在变换后保持平行线仍然保持平行。
Graphics2D
类提供了几种改变transform属性的方法。您可以构造一个新的AffineTransform
,并通过调用transform
来更改Graphics2D
的transform属性。
AffineTransform
定义了以下工厂方法,以便更容易地构造新的变换:
getRotateInstance
getScaleInstance
getShearInstance
getTranslateInstance
或者,您可以使用Graphics2D
的变换方法之一来修改当前的变换。当您调用这些便利方法之一时,结果变换将与当前变换连接在一起,并在渲染期间应用:
rotate
—— 指定以弧度为单位的旋转角度scale
—— 指定在x和y方向上的缩放因子shear
—— 指定在x和y方向上的剪切因子translate
—— 指定在x和y方向上的平移偏移量您还可以直接构造一个AffineTransform
对象,并通过调用transform
方法与当前变换连接。
drawImage
方法也可以重载,允许您指定一个在图像渲染时应用的AffineTransform
。在调用drawImage
时指定变换不会影响Graphics2D
的transform属性。
以下程序与StrokeandFill
相同,但还允许用户在渲染选定对象时选择要应用的变换。
包含了这个 applet 的完整代码。Transform.java
当从变换菜单中选择一个变换时,该变换将被连接到 AffineTransform
at
上:
public void setTrans(int transIndex) { // 设置 AffineTransform。 switch ( transIndex ) { case 0 : at.setToIdentity(); at.translate(w/2, h/2); break; case 1 : at.rotate(Math.toRadians(45)); break; case 2 : at.scale(0.5, 0.5); break; case 3 : at.shear(0.5, 0.0); break; } }
在显示与菜单选项对应的形状之前,应用程序首先从 Graphics2D
对象中获取当前的变换:
AffineTransform saveXform = g2.getTransform();
渲染完成后,将恢复这个变换到 Graphics2D
中。
在获取当前变换之后,还创建了另一个 AffineTransform
,名为 toCenterAt
,它使得形状在面板中心渲染。将 at
的 AffineTransform
连接到 toCenterAt
上:
AffineTransform toCenterAt = new AffineTransform(); toCenterAt.concatenate(at); toCenterAt.translate(-(r.width/2), -(r.height/2));
使用 transform
方法将 toCenterAt
变换连接到 Graphics2D
变换中:
g2.transform(toCenterAt);
渲染完成后,使用 setTransform
方法恢复原始变换:
g2.setTransform(saveXform);
setTransform
方法将坐标变换连接到现有的变换上。 setTransform
方法会覆盖 Graphics2D
对象的当前变换,这可能会造成其他情况下的需要,比如在窗口中定位 Swing 和轻量级组件。按照以下步骤执行变换:
getTransform
方法获取当前的变换。transform
、translate
、scale
、shear
或 rotate
连接一个变换。setTransform
方法恢复原始变换。