Graphics2D繼承自Graphics,它擴展了Graphics的繪圖功能,擁有更強大的二維圖形處理能力,提供對幾何形狀、坐標轉換、顏色管理以及文字布局等更精確的控制。
Graphics2D定義了幾種方法,用于添加或改變圖形的狀態屬性。可以通過設定和修改狀態屬性,指定畫筆寬度和畫筆的連接方式,設定平移、旋轉、縮放或修剪變換圖形,以及設定填充圖形的顏色和圖案等。
圖形狀態屬性用特定的對象存儲。
常用繪圖屬性
stroke屬性
我們可以調用調用如下方法來設置stroke屬性:public abstract void setStroke(Stroke s)
stroke屬性用于控制線條的寬度、筆形樣式、線段連接方式或短劃線圖案。
如果我們要設置stroke屬性,則應當先創建Stroke引用的對象,但由于Stroke為接口類型,所以我們要創建對象,可以創建其已知實現類BasicStroke的對象。
BasicStroke常用的構造方法有:// 構造一個具有指定屬性的實心的 BasicStrokepublic BasicStroke(float width, int cap, int join)
// 構造一個具有指定線條寬度以及 cap 和 join 風格為默認值的實心 BasicStrokepublic BasicStroke(float width)
cap是端點樣式,可取值為:CAP_BUTT(無修飾),CAP_ROUND(半徑等于畫筆寬度一半的圓形裝飾末端),CAP_SQUARE(正方形末端,默認值)。
join是用于定義兩線段交匯處的連接方式:JOIN_BEVEL(無修飾),JOIN_MITER(尖形末端,默認值),JOIN_ROUND(圓形末端)。
clip屬性
clip屬性用于實現剪裁效果。設置剪裁屬性可調用如下方法確定剪裁區的Shape:public abstract void setClip(int x, int y, int width, int height)
連續多個setClip()得到它們交集的剪裁區。
paint屬性
paint屬性控制填充效果,通過調用setPaint()方法設置:public abstract void setPaint(Paint paint)
paint可以同時作用在邊線和填充上,可以是單色,漸變和圖案,任何paint都需要實現java.awt.Paint接口。因為Color類實現了java.awt.Paint接口,所有的Color對象都是Paint對象。
GradientPaint類:public GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2)
這個類用顏色漸變填充一個區域,構造函數指定定比例和顏色。圖形引擎會從第一個點到第二個點之間線性變化兩個顏色:從(x1,y1)到(x2,y2)顏色從c1漸變到c2。我們還可以指定顏色圖案是否允許重復。
TexturePaint類:public TexturePaint(BufferedImage txtr, Rectangle2D anchor)
這個類平鋪一個圖像來填充圖形,構造函數接收一個java.awt.image.BufferedImage和一個Rectangle2D,把圖像影射到矩形里,然后平鋪矩形。
我們可以先創建GradientPaint類或TexturePaint類的對象,再調用Graphics2D的setPaint()方法設置填充效果。
Font屬性
所有的文本都使用能表現文字的樣式圖形渲染。當前的字體決定了字體的形狀。使用繼承自java.awt.Graphics的getFont()方法和setFont()方法來操縱字體。盡管設置字體相對簡單的工作,Java 2D還是為文本描繪提供了豐富的選項。
Transform屬性
transform屬性用來實現常用的圖形平移、縮放和斜切等變換操作。我們可以調用setTransform()來設置transform屬性:public abstract void setTransform(AffineTransform Tx)
該方法需要一個AffineTransform對象的參數,所以首先創建AffineTransform對象,然后調用setTransform()方法設置transform屬性。最后,用具有指定屬性的Graphics2D對象繪制圖形。
創建AffineTransform對象的方法有:// 旋轉變換,旋轉theta弧度public static AffineTransform getRotateInstance(double theta)
// 繞旋轉中心(anchorx, anchory)旋轉public static AffineTransform getRotateInstance(double theta, double anchorx, double anchory)
// 縮放變換,x和y方向分別按sx,sy比例變換public static AffineTransform getScaleInstance(double sx, double sy)
// 錯切變換,shx和shy指定斜拉度public static AffineTransform getShearInstance(double shx, double shy)
// 平移變換,tx和ty表示x和y方向平移距離public static AffineTransform getTranslateInstance(double tx, double ty)
當然,也可以先創建一個沒有transform屬性的AffineTransform對象,然后用以下方法指定圖形平移、旋轉、縮放變換屬性:// 將圖形在x軸方向平移tx像素,y軸方向平移ty像素public void translate(double tx, double ty)
// 旋轉theta弧度public void rotate(double theta)
// 圖形以點(anchorx, anchory)為軸點,旋轉theta弧度public void rotate(double theta, double anchorx, double anchory)
// 圖形在x軸方向縮放sx倍,縱向縮放sy倍public void scale(double sx, double sy)
composit屬性
composit屬性設置圖形重疊區域的效果。可通過調用setComposite()方法設置該屬性:public abstract void setComposite(Composite comp)
例如先用方法AlphaComposite.getInstance(int rule, float alpha)得到AlphaComposite對象,再通過setComposite()方法設置混合效果。AlphaComposite在圖形和圖像中實現混合和透明效果,Alpha值的范圍為0.0f(完全透明)-1.0f(完全不透明)。
使用Graphics2D繪圖
Graphics2D類仍然保留Graphics類的繪圖方法,同時增加了許多新方法。新方法將幾何圖形(線段、圓等)作為一個對象來繪制。在java.awt.geom包中聲明的一系列類,分別用于創建各種身體圖形對象。常用的主要有:?Line2D - 線段類?RoundRectangle2D - 圓角矩形類?Ellipse2D - 橢圓類?Arc2D - 圓弧類?QuadCurve2D - 二次曲線類?CubicCurve2D - 三次曲線類。
要用Graphics2D類的新方法畫一個圖形。先在重畫方法paintComponent()或paint()中,把參數對象g強制轉換成Graphics2D對象;然后,用上述圖形類提供的靜態內部類構造方法Double()或Float()創建該圖形的對象;最后,以圖形對象為參數調用Graphics2D對象的draw()方法繪制這個圖形。
畫一條線段:/* 畫線 */Stroke s = new BasicStroke(20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);g2d.setStroke(s); Line2D line = new Line2D.Double(30,50,100,200);g2d.draw(line);
畫一個圓角矩形:/* 畫圓角矩形 */g2d.setColor(Color.BLUE);RoundRectangle2D rect = new RoundRectangle2D.Double(100, 50, 100, 50, 4, 4);g2d.draw(rect);
畫一個旋轉一定角度的矩形:/* 畫旋轉一定角度的矩形 */Rectangle2D rect2 = new Rectangle2D.Double(60, 160, 60, 90);AffineTransform transform = new AffineTransform();transform.rotate(45 * Math.PI / 180, 90, 200); // 圍繞(90,200)點旋轉圖形45度g2d.setTransform(transform);g2d.draw(rect2);
|
新聞熱點
疑難解答