Java 2D API - 1. 基本概念

 

Java 2D API扩展AWT包,对二维图形、文本及成像功能提供了支持,可用于开发复杂的界面、绘图软件和图像编辑器。Java 2D对象位于用户坐标空间(User coordinate space),当对象呈如今屏幕或打印机,用户空间坐标转换为设备空间坐标(device space coordinate)。下面两个类对 Java 2D API十分重要:java

  • Graphics
  • Graphics2D

 

Java 2D API提供了以下功能:编程

  • 为显示设备和打印机等提供了统一的渲染模型;
  • 提供了大量的几何图元(geometric primitive),如曲线(curves)、方形(rectangle)、椭圆(ellipse),并包含几乎可生成任何几何图形的机制;
  • 图形、文本和图像的hit detection 机制;
  • 用于重叠图像对象渲染的混合模型;
  • 加强颜色支持;
  • 打印复杂的文档;
  • 渲染的质量控制。

 

1. 坐标系数组

Java 2D API 包含两套坐标空间:编辑器

  • 用户空间(User space)  - 绘制图形区域坐标系统
  • 设备空间(Device space)  - 输出设备如屏幕、窗口或打印机的坐标系统

 

用户空间是编程时所使用的坐标空间,该坐标体系是一个与设备无关的逻辑坐标系统。布局

用户空间坐标的原点在左上角,x坐标向右递增,y向下递增,以下图所示。全部的坐标以整数指定(大多时候使用整数就足够了,也提供了floatdouble支持)字体

clip_image001[4]

 

设备空间与具体设备相关,虽然屏幕坐标系统和打印机的坐标系统相差很大,可是对Java程序没有任何影响,编程时彻底不用考虑。spa

 

2.  Java 2D 渲染code

Java 2D API为不一样设备提供了统一的渲染模型,无论目标设备是打印机仍是屏幕,渲染过程在API层次都是同样的。当须要显示某个组件,其paint() update() 方法都能以配置合适的Graphics 调用。orm

 

Graphics属性:对象

  • Color: 当前绘制颜色(java.awt.Color)。全部的绘制,着色和纯文本输出都将以指定的颜色显示;
  • Font:当前字体(java.awt.Font)。用于全部纯文本输出的字体。
  • Clipjava.awt.Shape类型,用于定义几何形状。该特性定义进行绘制的区域。一般这一形状与整个图形环境相同,但也不必定如此。
  • ClipBoundsjava.awt.Rectangle对象,表示包围Clip属性所需的Shape类型的最小矩形。只读属性。
  • FontMetricsjava.awt.FontMetrics只读特性。该对象包含关于图形环境中当前起做用的Font的信息。获取该信息的机制被LineMetrics类取代。
  • Paint Mode:该特性控制环境使用当前颜色的方式。

 

Graphics2D类扩展Graphics类,提供了更多的图形绘制功能。包括:

  • stroke paint属性(draw方法),用于渲染几何图元的边框;
  • paint 属性 (fill方法),使用特定颜色或图案填充图形;
  • font 属性,(drawString方法)渲染文本,经过font属性将字符串转换为字形(glyph),而后经过paint属性填充颜色或图形;
  • 渲染图像(drawImage方法)

另外,Graphics2D还包含Graphics的方法,如drawOval, fillRect

 

以上全部方法能够分为两类:

  1. 绘制图形的方法
  2. 渲染图形的方法

 

第二类方法经过设置 Graphics2D 的属性值实现如下渲染功能:

  • 改变笔画宽度
  • 改变笔画之间的链接方式
  • 指定须要渲染的区域
  • 对图形进行平移、旋转、缩放等
  • 设置图形填充的颜色和图案
  • 设置多个图形组合的方式

 

要使用Graphics2D的功能,须要对 Graphics 进行强制转换:

publicvoid paint(Graphics g){

Graphics2D g2 = (Graphics2D) g;

……

}

 

下面以具体图形展现 Graphics2D 的不一样特性:

clip_image002[4]

pen属性,应用于图形边框。该stroke属性容许以任意的点尺寸(point size)、虚线模式(dashing pattern) 、末端连接方式绘制线条。

clip_image003[4]

fill属性,用于图形内部。该paint属性支持以纯色、渐变色或图纹等不一样方式填充图形。

clip_image004[4]

compositing属性,用于重合对象的渲染、

clip_image005[4]

transform属性,将渲染对象从用户空间转换为设备空间时应用的属性。包括平移、渲染、缩放等。

clip_image006[4]

clip属性,经过Shape对象指定须要渲染区域的。

clip_image007[4]

font属性,将文本转换为字形(glyphs)

clip_image008[4]

渲染建议(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)

clip_image009[4]

 

黄色部分是遗留类。

 

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, Arc2DEllipse2D 图元都扩展自 RectangularShape 类,该类实现了Shape接口。

clip_image010[4]

 

3.4 Quadratic and Cubic Curves (二次和三次曲线)

QuadCurve2D 用于建立二次曲线。二次曲线经过两个端点和一个控制点定义。

CubicCurve2D 类用于建立三次曲线。三次曲线经过两个端点和两个控制点定义。

二次曲线

clip_image011[4]

三次曲线

clip_image012[4]

 

3.5 Arbitrary Shapes

GeneralPath类可用于建立任意形状。该类经过指定图形的边框建立任意形状。如,下图用三条直线和一条三次曲线建立曲线:

clip_image013[4]

 

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 facefont face集合构成一个font familyfont 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 管理文本布局的两种机制:

  • TextLayout管理文本布局(text layout),文本高亮(highlighting)hit detectionTextLayout可用于处理大部分状况,包括混合字体文本、混合语言和双向文本等。
  • 能够用于Font类建立本身的GlyphVector对象,而后使用Graphics2D类渲染GlyphVector。如此可以彻底控制文本的形状和位置。

 

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,也能够经过载入外部图片(PNGGIF)建立BufferedImage

不论是哪一种方式,Java2D API都容许在图片上进行绘制。因此,图形不局限于摄影类型图片,也包含弧线、文本甚至其余的图片,均可以绘制在一张图片上,以下所示:

clip_image014[4]

 

Java 2D API容许对BufferedImage进行过滤,而且内置了许多过滤器。例如,ConsolveOp 过滤器可用于模糊(blur)或锐化(sharpen) 图片。处理后的图片能够输出到屏幕上,打印出来或者输出为PNGGIF等格式进行保存。

 

6. 打印(Printing)

全部的Swing Java 2D 图像(graphics), 包括复合(composited)图形图像,均可以经过Java2D Printing API处处到打印机。该API 还提供了组成文本的功能,从而能够对打印进行控制,如改变页面打印顺序等。

输出到打印机和输出到屏幕相似:打印系统控制页面什么时候打印,绘制系统控制一个组件什么时候在屏幕显示。

 

Java 2D Printing API 的打印系统使用callback模型控制页面的打印。经过应用程序提供待打印文本,打印系统控制什么时候对页面进行打印。

 

下面的两个特性对支持打印十分重要:

  • 任务控制(Job control) - 用于发起和控制打印任务,包括显示标准打印和设置对话框。
  • 页码导航(Pagination) - 在打印系统发出请求时,渲染每一个页面。

 

当须要将页面图像化,打印系统以特定配置的Graphics调用应用的 print 方法。要使用Java 2D API特性,须要将Graphics 转换为Graphics2D,和绘图时同样。

相关文章
相关标签/搜索