裁剪绘图区域(Java™教程 > 2D图形 > Java2D高级主题)
本 Java 教程适用于 JDK 8。本页中描述的示例和实践不利用后续版本引入的改进,可能使用不再可用的技术。
请参阅Java 语言更改,了解 Java SE 9 及后续版本的更新语言特性的摘要。
请参阅JDK 发行说明,了解所有 JDK 发行版本的新功能、增强功能以及已删除或已弃用选项的信息。
任何Shape
对象都可以用作限制渲染区域的剪辑路径。剪辑路径是Graphics2D
上下文的一部分;要设置剪辑属性,调用Graphics2D.setClip
并传入定义要使用的剪辑路径的Shape
。通过调用clip
方法并传入另一个Shape
,可以缩小剪辑路径;剪辑设置为当前剪辑和指定Shape
的交集。
此示例通过动画显示剪辑路径以显示图像的不同部分。
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);
剪辑区域还可以从文本字符串创建。以下示例创建一个带有字符串The Starry Night的TextLayout
。然后,它获取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);
Starry.java
包含了这个程序的完整代码。这个小程序需要Starry.gif
图像文件。