文档

Java™ 教程
隐藏目录
转换形状、文本和图像
路径: 2D 图形
课程: Java2D 高级主题

变换形状、文本和图像

你可以通过修改Graphics2D上下文中的transform属性来在渲染时移动、旋转、缩放和剪切图形元素。transform属性由AffineTransform类的实例定义。仿射变换是一种变换,例如平移、旋转、缩放或剪切,在变换后保持平行线仍然保持平行。

Graphics2D类提供了几种改变transform属性的方法。您可以构造一个新的AffineTransform,并通过调用transform来更改Graphics2D的transform属性。

AffineTransform定义了以下工厂方法,以便更容易地构造新的变换:

或者,您可以使用Graphics2D的变换方法之一来修改当前的变换。当您调用这些便利方法之一时,结果变换将与当前变换连接在一起,并在渲染期间应用:

您还可以直接构造一个AffineTransform对象,并通过调用transform方法与当前变换连接。

drawImage方法也可以重载,允许您指定一个在图像渲染时应用的AffineTransform。在调用drawImage时指定变换不会影响Graphics2D的transform属性。

示例:Transform

以下程序与StrokeandFill相同,但还允许用户在渲染选定对象时选择要应用的变换。


注意:  如果您看不到运行的小程序,您需要安装至少Java SE Development Kit (JDK) 7版本。

Transform.java 包含了这个 applet 的完整代码。

当从变换菜单中选择一个变换时,该变换将被连接到 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,它使得形状在面板中心渲染。将 atAffineTransform 连接到 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 和轻量级组件。按照以下步骤执行变换:
  1. 使用 getTransform 方法获取当前的变换。
  2. 使用 transformtranslatescaleshearrotate 连接一个变换。
  3. 执行渲染。
  4. 使用 setTransform 方法恢复原始变换。


上一页: Java2D的高级主题
下一页: 剪辑绘图区域