java.lang.Object java.awt.Graphics java.awt.Graphics2D
public abstract class Graphics2D
此 Graphics2D
类扩展 Graphics
类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。
Graphics2D
对象的坐标都在一个与设备无关并且名为用户空间的坐标系中指定,用户空间由应用程序使用。
Graphics2D
对象包含一个
AffineTransform
对象作为其呈现状态的一部分,后者定义了如何将坐标从用户空间转换到设备空间中与设备有关的坐标。
设备空间中的坐标通常是指单个设备像素,并根据这些像素之间无限小的间距对齐。某些 Graphics2D
对象可用于捕获对存储器的呈现操作并存入图形元文件,以后可在未知物理分辨率的具体设备上重放。由于在捕获呈现操作时分辨率可能未知,所以 Graphics2D
Transform
的设置可将用户坐标转换为虚拟设备空间,该设备空间与目标设备的预期分辨率接近。如果估计值不正确,则在重放时可能需要进一步转换。
某些由呈现属性对象执行的操作发生在设备空间中,但所有 Graphics2D
方法都采用用户空间坐标。
每个 Graphics2D
对象都与一个定义呈现位置的目标关联。GraphicsConfiguration
对象定义呈现目标的特征,如像素格式和分辨率。在 Graphics2D
对象的整个生命周期中都使用相同的呈现目标。
创建 Graphics2D
对象时,GraphicsConfiguration
将为 Graphics2D
的目标(Component
或 Image
)指定默认转换,此默认转换将用户空间坐标系映射到屏幕和打印机设备坐标,使原点映射到设备目标区域的左上角,并将 X 坐标轴向右方延伸,将 Y 坐标轴向下方延伸。对于接近 72 dpi 的设备(例如屏幕设备),默认转换的缩放比例设置为 1:1。对于高分辨率设备(例如打印机),默认转换的缩放比例设置为每平方英寸大约 72 个用户空间坐标。对于图像缓冲区,默认转换为 Identity
转换。
Graphics2D
呈现属性控制。呈现器可以优化当中的许多步骤:可以缓存结果以用于未来调用;可以将多个虚拟步骤合成一个操作;可以将多种属性识别为共用的简单情况(可以通过修改操作的其他部分来消除各种属性间的差别)。
呈现过程中的步骤有:
Clip
。 Clip
由用户空间中的 Shape
指定,由使用 Graphics
和 Graphics2D
中各种 clip 操作方法的程序控制。此用户剪贴区 由当前 Transform
转换到设备空间中,并与设备剪贴区 合并,后者是通过窗口可见性和设备范围定义的。用户剪贴区和设备剪贴区的组合定义复合剪贴区,复合剪贴区确定最终的剪贴区域。呈现系统不能修改用户剪贴区来反映得到的复合剪贴区。 Graphics2D
上下文中当前的 Composite
属性将颜色应用于目标绘图面。 Shape
操作
draw(Shape)
操作,则 Graphics2D
上下文中当前 Stroke
属性上的 createStrokedShape
方法将用于构造包含指定 Shape
轮廓的新 Shape
对象。 Graphics2D
上下文中的当前 Transform
将 Shape
从用户空间转换到设备空间。 Shape
的轮廓是通过使用 Shape
的 getPathIterator
方法提取的,该方法返回一个沿着 Shape
边界迭代得到的 PathIterator
对象。 Graphics2D
对象无法处理 PathIterator
对象返回的曲线段,则可以调用 Shape
的 getPathIterator
替代方法,该方法可使 Shape
变得平滑。 PaintContext
,需要 Graphics2D
上下文中的当前 Paint
,它指定了在设备空间中呈现的颜色。 String
所需的字形集:
String
,则要求 Graphics2D
上下文中的当前 Font
将 String
中的 Unicode 字符转换为一个字形集,以表现 Font 实现的基本布局和成形算法。 AttributedCharacterIterator
,则要求迭代器使用其内嵌的字体属性将其自身转换为 TextLayout
。TextLayout
实现更为复杂的字形布局算法,用于为不同书写方向的多种字体自动执行 Unicode 双方向布局调整。 GlyphVector
,则 GlyphVector
对象已经包含了特定于字体的合适字形代码和每个字形位置的显式坐标。 Font
以获取指定字形的轮廓。这些轮廓被视为用户空间中相对于步骤 1 中确定的每个字形位置的形状。 Shape
操作下指示的方式填充。 PaintContext
以获取 Paint
,Paint 指定了设备空间中呈现的颜色。 Image
操作
Image
的边界框定义。此边界框在图像空间中指定,该空间即 Image
对象的本地坐标系。 AffineTransform
被传递到 drawImage(Image, AffineTransform, ImageObserver)
,则使用 AffineTransform
将边界框从图像空间转换到用户空间。如果未提供 AffineTransform
,则认为边界框已存在于用户空间中。 Transform
将 Image
的边界框从用户空间转换到设备空间。注意,转换边界框的结果不一定会得到设备空间中的矩形区域。 Image
对象确定要呈现的颜色,并根据当前 Transform
和可选图像转换所指定的源到目标坐标映射关系进行采样。 Graphics2D
呈现属性的默认值有:
Paint
Component
的颜色。
Font
Component
的
Font
。
Stroke
Transform
Component
的
GraphicsConfiguration
的
getDefaultTransform
。
Composite
AlphaComposite.SRC_OVER
规则。
Clip
Clip
,输出局限于
Component
。
Java 2D(tm)(Java(tm) 2 平台)API 支持抗锯齿呈现器。一像素宽的画笔不需要完全落在像素 N 或像素 N+1 上。该画笔可以部分落在这两个像素上。不需要为宽画笔选择一个偏离方向,因为沿画笔遍历边缘发生的混合可让画笔的子像素位置对用户可见。另一方面,如果通过将 KEY_ANTIALIASING
提示键设置为 VALUE_ANTIALIAS_OFF
提示值而关闭了抗锯齿,则当画笔跨在像素边界上时,呈现器可能需要应用偏离来确定要修改哪个像素,例如在设备空间中,当画笔沿着整数坐标绘制时。虽然抗锯齿呈现器的功能使之不再需要呈现模型为画笔指定一个偏离,但对于在屏幕上绘制一像素宽的水平线和垂直线这种常见情形,还是需要抗锯齿和非抗锯齿呈现器执行类似的操作。为了确保通过将 KEY_ANTIALIASING
提示键设置为 VALUE_ANTIALIAS_ON
而打开的抗锯齿不会导致这些线突然变为此宽度的二倍或一半不透明,需要让该模型为这些线指定一个路径,使它们完全覆盖特定的像素集,以帮助提高其平滑性。
Java 2D API 维持与 JDK 1.1 呈现行为的兼容性,遗留操作和现有呈现器行为在 Java 2D API 下没有改变。定义了映射到常规 draw
和 fill
方法的遗留方法,它明确指示 Graphics2D
根据 Stroke
和 Transform
属性以及呈现提示的设置扩展 Graphics
的方式。在默认属性设置下该定义的执行方式完全相同。例如,默认 Stroke
是一个宽度为 1 且没有虚线的 BasicStroke
,屏幕绘制的默认 Transform 是 Identity 转换。
下面两个规则提供了可预见的呈现行为(无论是否使用了重叠还是抗锯齿)。
BasicStroke
对象勾画的线和路径可以“标准化”,从而在不同的可绘制点上定位时,无论使用重叠还是抗锯齿呈现进行的绘制都能提供一致的轮廓呈现。此标准化过程通过 KEY_STROKE_CONTROL
提示控制。虽然未指定准确的标准化算法,但此标准化的目标是为了确保可以使用一致的可视外观呈现线条,而不考虑它们在像素网格上的位置;另一个目的是促进以抗锯齿模式呈现更连续的水平和垂直线,从而与没有抗锯齿的线更为相似。典型的标准化步骤可以将抗锯齿线端点提升到像素中心,以减少混合量;也可以调整无抗锯齿线的子像素位置,以便浮点线宽度舍入为近似相等的偶数或奇数像素计数。此过程可以将端点向上移动半个像素(通常沿两个坐标轴的正无穷大方向移动),以得到一致的结果。 在默认属性设置下,以下定义的常规遗留方法与以前指定行为的执行方式完全相同:
fill
操作,包括 fillRect
、fillRoundRect
、fillOval
、fillArc
、fillPolygon
和 clearRect
,现在可以使用所需的 Shape
调用 fill
。例如,在填充矩形时可调用: fill(new Rectangle(x, y, w, h));
drawLine
、drawRect
、drawRoundRect
、drawOval
、drawArc
、drawPolyline
和 drawPolygon
,现在可以使用所需的 Shape
调用 draw
。例如,在绘制矩形时可调用: draw(new Rectangle(x, y, w, h));
draw3DRect
和 fill3DRect
方法是根据 Graphics
类中的 drawLine
和 fillRect
方法实现的,根据 Graphics2D
上下文中的当前 Stroke
和 Paint
对象可以预知其行为。此类重写了那些独占地使用当前 Color
的实现,重写当前 Paint
以及使用 fillRect
的 Paint
,以描述与以前存在的方法完全相同的行为,而不考虑当前 Stroke
的设置。 Graphics
类仅定义了
setColor
方法来控制要绘制的颜色。由于 Java 2D API 扩展了
Color
对象来实现新的
Paint
接口,因此现有的
setColor
方法现在是将当前
Paint
属性设置为
Color
对象的便捷方法。
setColor(c)
等同于
setPaint(c)
。
Graphics
类定义了两种方法来控制如何将颜色应用到目标。
setPaintMode
方法实现为设置默认 Composite
的便捷方法,它等同于 setComposite(new AlphaComposite.SrcOver)
。 setXORMode(Color xorcolor)
方法实现为设置特殊 Composite
对象的便捷方法,它忽略源颜色的 Alpha
分量,并将目标颜色设置为以下值: dstpixel = (PixelOf(srccolor) ^ PixelOf(xorcolor) ^ dstpixel);
RenderingHints
构造方法摘要 | |
---|---|
protected |
Graphics2D() 构建一个新的 Graphics2D 对象。 |
方法摘要 | |
---|---|
abstract void |
addRenderingHints(Map<?,?> hints) 为呈现算法设置任意数量的首选项值。 |
abstract void |
clip(Shape s) 将当前 Clip 与指定 Shape 的内部区域相交,并将 Clip 设置为所得的交集。 |
abstract void |
draw(Shape s) 使用当前 Graphics2D 上下文的设置勾画 Shape 的轮廓。 |
void |
draw3DRect(int x, int y, int width, int height, boolean raised) 绘制指定矩形的 3-D 高亮显示边框。 |
abstract void |
drawGlyphVector(GlyphVector g, float x, float y) 使用 Graphics2D 上下文的呈现属性,呈现指定 GlyphVector 的文本。 |
abstract void |
drawImage(BufferedImage img, BufferedImageOp op, int x, int y) 呈现使用 BufferedImageOp 过滤的 BufferedImage 。 |
abstract boolean |
drawImage(Image img, AffineTransform xform, ImageObserver obs) 呈现一个图像,在绘制前进行从图像空间到用户空间的转换。 |
abstract void |
drawRenderableImage(RenderableImage img, AffineTransform xform) 呈现 RenderableImage ,在绘制前进行从图像空间到用户空间的转换。 |
abstract void |
drawRenderedImage(RenderedImage img, AffineTransform xform) 呈现 RenderedImage ,在绘制前进行从图像空间到用户空间的转换。 |
abstract void |
drawString(AttributedCharacterIterator iterator, float x, float y) 依照 TextAttribute 类的规范应用指定迭代器的属性,呈现指定迭代器的文本。 |
abstract void |
drawString(AttributedCharacterIterator iterator, int x, int y) 依照 TextAttribute 类的规范应用指定迭代器的属性,呈现指定迭代器的文本。 |
abstract void |
drawString(String str, float x, float y) 使用 Graphics2D 上下文中当前文本属性状态呈现由指定 String 指定的文本。 |
abstract void |
drawString(String str, int x, int y) 使用 Graphics2D 上下文中的当前文本属性状态呈现指定的 String 的文本。 |
abstract void |
fill(Shape s) 使用 Graphics2D 上下文的设置,填充 Shape 的内部区域。 |
void |
fill3DRect(int x, int y, int width, int height, boolean raised) 绘制一个用当前颜色填充的 3-D 高亮显示矩形。 |
abstract Color |
getBackground() 返回用于清除区域的背景色。 |
abstract Composite |
getComposite() 返回 Graphics2D 上下文中的当前 Composite |
abstract GraphicsConfiguration |
getDeviceConfiguration() 返回与此 Graphics2D 关联的设备配置。 |
abstract FontRenderContext |
getFontRenderContext() 获取此 Graphics2D 上下文中 Font 的呈现上下文。 |
abstract Paint |
getPaint() 返回 Graphics2D 上下文中的当前 Paint |
abstract Object |
getRenderingHint(RenderingHints.Key hintKey) 返回呈现算法的单个首选项的值。 |
abstract RenderingHints |
getRenderingHints() 获取呈现算法的首选项。 |
abstract Stroke |
getStroke() 返回 Graphics2D 上下文中的当前 Stroke |
abstract AffineTransform |
getTransform() 返回 Graphics2D 上下文中当前 Transform 的副本。 |
abstract boolean |
hit(Rectangle rect, Shape s, boolean onStroke) 检查指定的 Shape 是否与设备空间中的指定 Rectangle 相交。 |
abstract void |
rotate(double theta) 将当前的 Graphics2D Transform 与旋转转换连接。 |
abstract void |
rotate(double theta, double x, double y) 将当前的 Graphics2D Transform 与平移后的旋转转换连接。 |
abstract void |
scale(double sx, double sy) 将当前 Graphics2D Transform 与缩放转换连接。 |
abstract void |
setBackground(Color color) 设置 Graphics2D 上下文的背景色。 |
abstract void |
setComposite(Composite comp) 为 Graphics2D 上下文设置 Composite 。 |
abstract void |
setPaint(Paint paint) 为 Graphics2D 上下文设置 Paint 属性。 |
abstract void |
setRenderingHint(RenderingHints.Key hintKey, Object hintValue) 为呈现算法设置单个首选项的值。 |
abstract void |
setRenderingHints(Map<?,?> hints) 使用指定的 hints 替换用于所有呈现算法首选项的值。 |
abstract void |
setStroke(Stroke s) 为 Graphics2D 上下文设置 Stroke |
abstract void |
setTransform(AffineTransform Tx) 重写 Graphics2D 上下文中的 Transform。 |
abstract void |
shear(double shx, double shy) 将当前 Graphics2D Transform 与剪裁转换连接。 |
abstract void |
transform(AffineTransform Tx) 根据“最后指定首先应用”规则,使用此 Graphics2D 中的 Transform 组合 AffineTransform 对象。 |
abstract void |
translate(double tx, double ty) 将当前 Graphics2D Transform 与平移转换连接。 |
abstract void |
translate(int x, int y) 将 Graphics2D 上下文的原点平移到当前坐标系中的点 (x, y)。 |
从类 java.awt.Graphics 继承的方法 |
---|
clearRect, clipRect, copyArea, create, create, dispose, drawArc, drawBytes, drawChars, drawImage, drawImage, drawImage, drawImage, drawImage, drawImage, drawLine, drawOval, drawPolygon, drawPolygon, drawPolyline, drawRect, drawRoundRect, fillArc, fillOval, fillPolygon, fillPolygon, fillRect, fillRoundRect, finalize, getClip, getClipBounds, getClipBounds, getClipRect, getColor, getFont, getFontMetrics, getFontMetrics, hitClip, setClip, setClip, setColor, setFont, setPaintMode, setXORMode, toString |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait |
构造方法详细信息 |
---|
protected Graphics2D()
Graphics2D
对象。由于
Graphics2D
是一个抽象类,而且它必须由不同输出设备的子类定制,所以无法直接创建
Graphics2D
对象。相反,
Graphics2D
对象必须从另一个
Graphics2D
对象获得、由某个
Component
创建,或者从
BufferedImage
之类的图像对象获得。
方法详细信息 |
---|
public void draw3DRect(int x, int y, int width, int height, boolean raised)
高亮显示效果所用的颜色根据当前颜色确定。得到的矩形覆盖的区域为 width + 1
像素宽乘以 height + 1
像素高。此方法独占使用当前 Color
,并忽略当前 Paint
Graphics
中的
draw3DRect
x
- 要绘制矩形的 x 坐标。
y
- 要绘制矩形的 y 坐标。
width
- 要绘制矩形的宽度。
height
- 要绘制矩形的高度。
raised
- 一个用于确定矩形是凸出平面显示还是凹入平面显示的 boolean 值。
Graphics.fill3DRect(int, int, int, int, boolean)
public void fill3DRect(int x, int y, int width, int height, boolean raised)
Color
确定。此方法独占使用当前
Color
,并忽略当前
Paint
Graphics
中的
fill3DRect
x
- 要填充矩形的 x 坐标。
y
- 要填充矩形的 y 坐标。
width
- 要填充矩形的宽度。
height
- 要填充矩形的高度。
raised
- 一个用于确定矩形是凸出平面显示还是凹入平面显示的 boolean 值。
Graphics.draw3DRect(int, int, int, int, boolean)
public abstract void draw(Shape s)
Graphics2D
上下文的设置勾画
Shape
的轮廓。应用的呈现属性包括
Clip
、
Transform
、
Paint
、
Composite
和
Stroke
属性。
public abstract boolean drawImage(Image img, AffineTransform xform, ImageObserver obs)
Graphics2D
中的当前
Transform
完成。在应用
Graphics2D
上下文中的 transform 属性之前,指定的转换被应用到图像。应用的呈现属性包括
Clip
、
Transform
和
Composite
属性。注意,如果指定的转换不可逆,则不会完成呈现。
img
- 要呈现的指定图像。如果
img
为 null,则此方法不执行任何动作。
xform
- 从图像空间到用户空间的转换
obs
- 转换了多个
Image
时要通知的
ImageObserver
Image
被完全加载并完全呈现,则为
true
,否则为 null;如果仍在加载
Image
,则为
false
transform(java.awt.geom.AffineTransform)
,
setTransform(java.awt.geom.AffineTransform)
,
setComposite(java.awt.Composite)
,
clip(java.awt.Shape)
,
Graphics.setClip(int, int, int, int)
public abstract void drawImage(BufferedImage img, BufferedImageOp op, int x, int y)
BufferedImageOp
过滤的
BufferedImage
。 应用的呈现属性包括
Clip
、
Transform
和
Composite
属性。这等价于:
img1 = op.filter(img, null); drawImage(img1, new AffineTransform(1f,0f,0f,1f,x,y), null);
op
- 在呈现之前要应用到图像的过滤器
img
- 要呈现的指定
BufferedImage
。 如果
img
为 null,则此方法不执行任何动作。
x
- 用户空间中呈现该图像左上角位置的 x 坐标
y
- 用户空间中呈现该图像左上角位置的 y 坐标
transform(java.awt.geom.AffineTransform)
,
setTransform(java.awt.geom.AffineTransform)
,
setComposite(java.awt.Composite)
,
clip(java.awt.Shape)
,
Graphics.setClip(int, int, int, int)
public abstract void drawRenderedImage(RenderedImage img, AffineTransform xform)
RenderedImage
,在绘制前进行从图像空间到用户空间的转换。从用户空间到设备空间的转换使用
Graphics2D
中的当前
Transform
完成。在应用
Graphics2D
上下文中的 transform 属性之前,指定的转换被应用到图像。应用的呈现属性包括
Clip
、
Transform
和
Composite
属性。注意,如果指定的转换不可逆,则不会完成呈现。
img
- 要呈现的图像。如果
img
为 null,则此方法不执行任何操作。
xform
- 从图像空间到用户空间的转换
transform(java.awt.geom.AffineTransform)
,
setTransform(java.awt.geom.AffineTransform)
,
setComposite(java.awt.Composite)
,
clip(java.awt.Shape)
,
Graphics.setClip(int, int, int, int)
public abstract void drawRenderableImage(RenderableImage img, AffineTransform xform)
RenderableImage
,在绘制前进行从图像空间到用户空间的转换。从用户空间到设备空间的转换使用
Graphics2D
中当前的
Transform
完成。在应用
Graphics2D
上下文中的 transform 属性之前,指定的转换被应用到图像。应用的呈现属性包括
Clip
、
Transform
和
Composite
属性。注意,如果指定的转换不可逆,则不会完成呈现。
呈现 RenderableImage
时,可以使用在 Graphics2D
对象上设置的呈现提示。如果由特定 RenderableImage
识别的特定提示需要显式控制,或者需要知道使用哪一个提示,则应直接从 RenderableImage
获取 RenderedImage
,并使用 drawRenderedImage
呈现它。
img
- 要呈现的图像。如果
img
为 null,则此方法不执行任何操作。
xform
- 从图像空间到用户空间的转换
transform(java.awt.geom.AffineTransform)
,
setTransform(java.awt.geom.AffineTransform)
,
setComposite(java.awt.Composite)
,
clip(java.awt.Shape)
,
Graphics.setClip(int, int, int, int)
,
drawRenderedImage(java.awt.image.RenderedImage, java.awt.geom.AffineTransform)
public abstract void drawString(String str, int x, int y)
Graphics2D
上下文中的当前文本属性状态呈现指定的
String
的文本。首字符的基线位于用户空间的 (
x,
y) 位置处。应用的呈现属性包括
Clip
、
Transform
、
Paint
、
Font
和
Composite
属性。对于脚本系统(如 Hebrew 和 Arabic)中的字符,在提供的坐标位于基线上最左边字符的情况下,可以从右到左呈现字形。
Graphics
中的
drawString