裁剪绘图区域(Java™教程 > 2D图形 > Java2D高级主题)
文档

Java™教程
隐藏目录
裁剪绘图区域
路径:2D 图形
教程:Java2D 高级主题

裁剪绘图区域

任何Shape对象都可以用作限制渲染区域的剪辑路径。剪辑路径是Graphics2D上下文的一部分;要设置剪辑属性,调用Graphics2D.setClip并传入定义要使用的剪辑路径的Shape。通过调用clip方法并传入另一个Shape,可以缩小剪辑路径;剪辑设置为当前剪辑和指定Shape的交集。

示例:ClipImage

此示例通过动画显示剪辑路径以显示图像的不同部分。


注意:  如果您看不到applet运行,请安装至少Java SE Development Kit (JDK) 7版本。

ClipImage.java包含此applet的完整代码。applet需要clouds.jpg图像文件。

剪辑路径由椭圆和随机设置尺寸的矩形的交集定义。将椭圆传递给setClip方法,然后调用clip将剪辑路径设置为椭圆和矩形的交集。

private Ellipse2D ellipse = new Ellipse2D.Float();
private Rectangle2D rect = new Rectangle2D.Float();
...
ellipse.setFrame(x, y, ew, eh);
g2.setClip(ellipse);
rect.setRect(x+5, y+5, ew-10, eh-10);
g2.clip(rect);

示例:Starry

剪辑区域还可以从文本字符串创建。以下示例创建一个带有字符串The Starry NightTextLayout。然后,它获取TextLayout的轮廓。TextLayout.getOutline方法返回一个Shape对象,并从此Shape对象的边界创建一个Rectangle。边界包含布局可以绘制的所有像素。将图形上下文中的颜色设置为蓝色,并绘制轮廓形状,如下图和代码片段所示。

星夜文本(轮廓)
FontRenderContext frc = g2.getFontRenderContext();
Font f = new Font("Helvetica", 1, w/10);
String s = new String("星夜");
TextLayout textTl = new TextLayout(s, f, frc);
AffineTransform transform = new AffineTransform();
Shape outline = textTl.getOutline(null);
Rectangle r = outline.getBounds();
transform = g2.getTransform();
transform.translate(w/2-(r.width/2), h/2+(r.height/2));
g2.transform(transform);
g2.setColor(Color.blue);
g2.draw(outline);   

接下来,使用从getOutline创建的Shape对象在图形上下文上设置了剪切区域。Van Gogh的著名画作星夜被绘制在这个剪切区域的左下角Rectangle对象。

g2.setClip(outline);
g2.drawImage(img, r.x, r.y, r.width, r.height, this);


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

Starry.java包含了这个程序的完整代码。这个小程序需要Starry.gif图像文件。


上一页:转换形状、文本和图像
下一页:合成图形