# 转换形状，文本和图像

> 原文： [https://docs.oracle.com/javase/tutorial/2d/advanced/transforming.html](https://docs.oracle.com/javase/tutorial/2d/advanced/transforming.html)

您可以修改`Graphics2D`上下文中的 transform 属性，以在渲染图形基元时移动，旋转，缩放和剪切图形基元。 transform 属性由 [`AffineTransform`](https://docs.oracle.com/javase/8/docs/api/java/awt/geom/AffineTransform.html) 类的实例定义。仿射变换是诸如平移，旋转，缩放或剪切之类的变换，其中平行线即使在被变换之后也保持平行。

[`Graphics2D`](https://docs.oracle.com/javase/8/docs/api/java/awt/Graphics2D.html) 类提供了几种更改 transform 属性的方法。您可以通过调用`transform`来构造新的`AffineTransform`并更改`Graphics2D`转换属性。

`AffineTransform`定义了以下工厂方法，以便更容易构造新的转换：

*   `getRotateInstance`
*   `getScaleInstance`
*   `getShearInstance`
*   `getTranslateInstance`

或者，您可以使用`Graphics2D`转换方法之一来修改当前转换。当您调用其中一种便捷方法时，生成的变换将与当前变换连接，并在渲染过程中应用：

*   `rotate` - 以弧度为单位指定旋转角度
*   `scale` - 指定 _x_ 和 _y_ 方向的比例因子
*   `shear` - 指定 _x_ 和 _y_ 方向的剪切系数
*   `translate` - 指定 _x_ 和 _y_ 方向的平移偏移

您还可以直接构造`AffineTransform`对象，并通过调用`transform`方法将其与当前转换连接。

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

## 示例：转换

以下程序与`StrokeandFill`相同，但也允许用户选择在渲染时应用于所选对象的变换。

&lt;applet alt="Transform applet" archive="examples/lib/TransformApplet.jar" code="Transform" height="400" width="550"&gt;&lt;param name="permissions" value="sandbox"&gt;&lt;/applet&gt;

* * *

**Note:**  If you don't see the applet running, you need to install at least the [Java SE Development Kit (JDK) 7](http://www.oracle.com/technetwork/java/javase/downloads/index.html) release.

* * *

[``Transform.java`` ](examples/Transform.java)包含此 applet 的完整代码。

从“变换”菜单中选择变换时，变换将连接到`AffineTransform` `at`：

```
public void setTrans(int transIndex) {
    // Sets the 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);

```

* * *

**Note:** Never use the `setTransform` method to concatenate a coordinate transform onto an existing transform. The `setTransform` method overwrites the `Graphics2D` object's current transform, which might be needed for other reasons, such as positioning Swing and lightweight components in a window. Use these steps to perform transformations:

1.  使用`getTransform`方法获取当前变换。
2.  使用`transform`，`translate`，`scale`，`shear`或`rotate`连接变换。
3.  执行渲染。
4.  使用`setTransform`方法恢复原始变换。

* * *