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,和繪圖時同樣。