Java 教程是针对 JDK 8 编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关 Java SE 9 及后续版本中更新的语言功能的摘要,请参阅 Java 语言更改。
有关所有 JDK 版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅 JDK 发行说明。
你可以通过修改Graphics2D上下文中的transform属性来在渲染时移动、旋转、缩放和剪切图形元素。transform属性由AffineTransform类的实例定义。仿射变换是一种变换,例如平移、旋转、缩放或剪切,在变换后保持平行线仍然保持平行。
Graphics2D类提供了几种改变transform属性的方法。您可以构造一个新的AffineTransform,并通过调用transform来更改Graphics2D的transform属性。
AffineTransform定义了以下工厂方法,以便更容易地构造新的变换:
getRotateInstancegetScaleInstancegetShearInstancegetTranslateInstance或者,您可以使用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 方法恢复原始变换。