转换形状,文本和图像
您可以在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
。
检索当前变换后,将创建另一个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:
切勿使用setTransform
方法将坐标变换连接到现有变换。 setTransform
方法将覆盖Graphics2D
对象的当前转换,由于其他原因,例如在窗口中放置 Swing 和轻量级组件,可能需要使用该转换。使用以下步骤执行转换:
-
使用
getTransform
方法获取当前的变换。 -
使用
transform
,translate
,scale
,shear
或rotate
连接转换。 -
执行渲染。
-
使用
setTransform
方法还原原始转换。