Java 2D API扩展AWT包,对二维图形、文本及成像功能提供了支持,可用于开发复杂的界面、绘图软件和图像编辑器。Java 2D对象位于用户坐标空间(User coordinate space),当对象呈如今屏幕或打印机,用户空间坐标转换为设备空间坐标(device space coordinate)。下面两个类对 Java 2D API十分重要:java
Java 2D API提供了以下功能:编程
1. 坐标系数组
Java 2D API 包含两套坐标空间:编辑器
用户空间是编程时所使用的坐标空间,该坐标体系是一个与设备无关的逻辑坐标系统。布局
用户空间坐标的原点在左上角,x坐标向右递增,y向下递增,以下图所示。全部的坐标以整数指定(大多时候使用整数就足够了,也提供了float和double支持)。字体
设备空间与具体设备相关,虽然屏幕坐标系统和打印机的坐标系统相差很大,可是对Java程序没有任何影响,编程时彻底不用考虑。spa
2. Java 2D 渲染code
Java 2D API为不一样设备提供了统一的渲染模型,无论目标设备是打印机仍是屏幕,渲染过程在API层次都是同样的。当须要显示某个组件,其paint() 或update() 方法都能以配置合适的Graphics 调用。orm
Graphics属性:对象
Graphics2D类扩展Graphics类,提供了更多的图形绘制功能。包括:
另外,Graphics2D还包含Graphics的方法,如drawOval, fillRect。
以上全部方法能够分为两类:
第二类方法经过设置 Graphics2D 的属性值实现如下渲染功能:
要使用Graphics2D的功能,须要对 Graphics 进行强制转换:
publicvoid paint(Graphics g){ Graphics2D g2 = (Graphics2D) g; …… } |
下面以具体图形展现 Graphics2D 的不一样特性:
pen属性,应用于图形边框。该stroke属性容许以任意的点尺寸(point size)、虚线模式(dashing pattern) 、末端连接方式绘制线条。 |
|
fill属性,用于图形内部。该paint属性支持以纯色、渐变色或图纹等不一样方式填充图形。 |
|
compositing属性,用于重合对象的渲染、 |
|
transform属性,将渲染对象从用户空间转换为设备空间时应用的属性。包括平移、渲染、缩放等。 |
|
clip属性,经过Shape对象指定须要渲染区域的。 |
|
font属性,将文本转换为字形(glyphs)。 |
|
渲染建议(Rendering hints),在渲染的速度和质量间进行取舍。例如,你能够指定是否使用反锯齿(antialiasing)。 |
3. 几何图形
Java 2D API提供了点、线、矩形、弧线、椭圆、曲线等一套标准的几何图形。这些基本图形都定义在 java.awt.gemo包中。任何其余的形状均可以经过这些基本图形进行组合得到。
Shape 接口表示一个几何图形,包含边框和内部区域。该接口定义的方法功能包括:描述和检查二维几何对象,支持曲线片断和图形子片断,而Graphics类只支持直线片断。
下面是对java.awt.geom 包中各个类的简介。
(AffineTransform, Arc2D, Area, CubicCurve, Dimension2D, Ellipse2D, FlatteningPathIterator, GeneralPath, Line2D, Path2D, QuadCurve, Rectangle2D, RectangularShape, RoundRectangle2D)
黄色部分是遗留类。
3.1 Points
Point2D 类定义了一个 (x,y) 坐标空间的点。在Java 2D API中 "point"不等价于 pixel。"point" 没有面积,不包含颜色,而且不能被渲染。
Points 用于建立其余的图形。 Point2D中包含一个计算两点之间距离的方法。
3.2 Lines
Line2D 是用于表示“线”的抽象类。线的坐标能够用 double 表示。Line2D类包含多个用于设置“线”终点的方法。也可使用GeneralPath 类建立直线。
3.3 Rectangular Shapes
Rectangle2D, RoundRectangle2D, Arc2D和Ellipse2D 图元都扩展自 RectangularShape 类,该类实现了Shape接口。
3.4 Quadratic and Cubic Curves (二次和三次曲线)
QuadCurve2D 用于建立二次曲线。二次曲线经过两个端点和一个控制点定义。
CubicCurve2D 类用于建立三次曲线。三次曲线经过两个端点和两个控制点定义。
3.5 Arbitrary Shapes
GeneralPath类可用于建立任意形状。该类经过指定图形的边框建立任意形状。如,下图用三条直线和一条三次曲线建立曲线:
3.6 Areas
经过Area类,能够对两个Shape 对象执行布尔操做,如(合并、交叉、相减)。该技术,也被称为区域几何学(Constructive area geometry),可用来迅速建立复杂的图形。
4. 文本(Text)
Java 2D API包含许多文本渲染功能,如字符串渲染,字体设置以及文本布局。
绘制静态字符串方法:调用Graphics 类的 drawString方法。经过Graphics 的 setFont方法指定字体。
若是你须要实现本身的文本编辑程序,或须要更好的控制文本的布局,则可使用 java.awt.font包中的类。
4.1 字体(Fonts)
字体中字符的形状的表示称为字形(glyph)。单个字符或多个字符可能以一个或多个glyph表示。例如, á可能以两个glyph表示,而连字fi则可能以一个glyph表示。
能够将字体(font)看作是一个glyph集合。一个字体能够包含多个属性(faces),如斜体(italic)、常规(regular)和加粗等,单个字体的不一样faces具备相似的排版特性,所以能够看作是同一字体的成员。换句话说,特定风格的字形(glyph)集合构成一个font face;font face集合构成一个font family;font family集合构成一个计算机上可用的全部字体。
Java 2D API经过Font实例指定字体。经过以下方法能够得到当前系统全部可用字体:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] fonts = ge.getAvailableFontFamilyNames(); for (String s : fonts) { System.out.println(s); } |
4.2 文本布局(Text Layout)
在显示文本前,必须对其进行排版,以合适的字形显示对应的字符。下面是Java 2D 管理文本布局的两种机制:
4.3 文本的渲染建议(Rendering Hints for Text)
Java 2D API 经过rendering hints控制图形和文本渲染的质量。Rendering hints封装在java.awt.RenderingHints类中。
对文原本说,该功能指反锯齿(也称为平滑边角)。例如,KEY_TEXT_ANTIALIASING可单独用于文本的平滑处理。
5. 图像(Images)
在Java2D API中,一张图片就是一个矩形的像素二维数组,每一个像素(pixel)表示特定位置的颜色,而维度表示图片的宽度和高度。
java.awt.image.BufferedImage是表示图片最重要的类。Java2D API 经过BufferedImage表示图片将其载入内存,从而能够直接访问。
可直接建立BufferedImage,也能够经过载入外部图片(如PNG、GIF等)建立BufferedImage。
不论是哪一种方式,Java2D API都容许在图片上进行绘制。因此,图形不局限于摄影类型图片,也包含弧线、文本甚至其余的图片,均可以绘制在一张图片上,以下所示:
Java 2D API容许对BufferedImage进行过滤,而且内置了许多过滤器。例如,ConsolveOp 过滤器可用于模糊(blur)或锐化(sharpen) 图片。处理后的图片能够输出到屏幕上,打印出来或者输出为PNG、GIF等格式进行保存。
6. 打印(Printing)
全部的Swing 和 Java 2D 图像(graphics), 包括复合(composited)图形图像,均可以经过Java2D Printing API处处到打印机。该API 还提供了组成文本的功能,从而能够对打印进行控制,如改变页面打印顺序等。
输出到打印机和输出到屏幕相似:打印系统控制页面什么时候打印,绘制系统控制一个组件什么时候在屏幕显示。
Java 2D Printing API 的打印系统使用callback模型控制页面的打印。经过应用程序提供待打印文本,打印系统控制什么时候对页面进行打印。
下面的两个特性对支持打印十分重要:
当须要将页面图像化,打印系统以特定配置的Graphics调用应用的 print 方法。要使用Java 2D API特性,须要将Graphics 转换为Graphics2D,和绘图时同样。