转换形状,文本和图像

您可以在Graphics2D上下文中修改 transform 属性,以在渲染图形基元时移动,旋转,缩放和剪切图形基元。转换属性由AffineTransform类的实例定义。仿射变换是诸如平移,旋转,缩放或剪切之类的变换,其中即使在变换之后,Parallel 线仍保持 Parallel。

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

AffineTransform定义了以下工厂方法,以使构造新转换更加容易:

  • getRotateInstance

  • getScaleInstance

  • getShearInstance

  • getTranslateInstance

或者,您可以使用Graphics2D转换方法之一来修改当前转换。当您调用以下便捷方法之一时,生成的变换将与当前变换连接在一起,并在渲染期间应用:

  • rotate —以弧度指定旋转角度

  • scale —在* x y *方向上指定比例因子

  • shear —在* x y *方向上指定剪切因子

  • translate —在* x y *方向上指定平移offset量

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

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

Example: Transform

以下程序与StrokeandFill相同,但是还允许用户选择一个变换,以在选定对象渲染时将其应用于该对象。

Note:

如果看不到 Servlets 正在运行,则需要至少安装Java SE 开发套件(JDK)7版本。

Transform.java包含此 Servlets 的完整代码。

从“变换”菜单中选择一个变换后,该变换将 String 联到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

检索当前变换后,将创建另一个AffineTransformtoCenterAt,从而在面板的中心渲染形状。 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:

切勿使用setTransform方法将坐标变换连接到现有变换。 setTransform方法将覆盖Graphics2D对象的当前转换,由于其他原因,例如在窗口中放置 Swing 和轻量级组件,可能需要使用该转换。使用以下步骤执行转换:

  • 使用getTransform方法获取当前的变换。

  • 使用transformtranslatescaleshearrotate连接转换。

  • 执行渲染。

  • 使用setTransform方法还原原始转换。