繪圖

java

  • java2D是一組支持高質量二維圖形、圖像、顏色和文本的類。它可用於繪製諸如圓、多邊形等幾何形狀,使用各種字體、顏色和線寬,處理顏色和圖案。
  • 在以前的版本中,Graphics類包含基本的圖形支持功能,但在Java2D中,這些方法已被更爲複雜,效率更高的方法所代替。
  • java2D中的第一個類是Graphics2D,它是Graphics的子類,它表示一種可在其中繪製圖形的環境,Graphics2D對象可能表示圖形用戶界面、打印機、或其他顯示設備上的一個組件。它包含java2D所需的擴展特性。
  • java中的用戶界面組件一般都有一個paintCompoent(Graphics)的方法,每當組件需要重新顯示時,該方法都被自動調用
  • 導致paintCompoent(Graphics)被調用的事件很多,其中包括:
    (1)包含組件的圖形用戶界面首次被顯示。
    (2)位於組件上面的窗口被關閉。
    (3)包含組件的圖形用戶界面的大小被調整。

圖形座標系

  • java2D使用的x,y座標系與我們設置框架大小時使用的相同。
  • java的座標系以像素爲作爲度量單位。座標原點(0,0)位於組件的左上角。從原點沿水平方向向右移動時,x座標將增多;沿垂直方向向下移動時,y座標將增大。所有的像素值都是整數,不能使用小數來指定顯示位置。

繪製文本

  • 要繪製文本,可調用Graphics2D對象的drawString()方法,並提供三個參數,(1)要顯示的String
    (2)顯示位置的x座標
    (3)顯示位置的y座標
abstract  void drawString(String str, float x, float y) 
          使用 Graphics2D 上下文中當前文本屬性狀態呈現由指定 String 指定的文本。 
abstract  void drawString(String str, int x, int y) 
          使用 Graphics2D 上下文中的當前文本屬性狀態呈現指定的 String 的文本。 
  • 上面的繪製使用的是默認字體。要使用其他字體,必須創建一個Font對象,Font對象表示字體的顏色、字形和字號。創建Font對象,需要將三個參數傳遞給它的構造函數。`
Font(String name, int style, int size) 
(1)字體名稱
字體的名稱可以是TrueType字體的名稱,如Arial、Garamond或Kaiser等。也可以是五種通
用字體之一:Dialog、DialogInput、Monospaced、SanSerif或Serif。這些字體用來指定要使
用的字體類型,而不要求使用特定的字體。
(2)字形
可選擇的字形有三種,分別是靜態類常量,Font.PLAIN,Font.BOLD、Font.ITALIC
(3)字號
 Font 的磅值大小
  • 創建字體後,便可以用該字體爲參數調用Graphics2D的setFont(Font)方法來使用它,setFont()方法設置後面調用drawString()方法時將使用的字體,以後需要繪製其他文本時,可以再次調用setFont()方法來修改字體。
  • 爲了是圖形用戶界面的文本美觀大方,常常需要確定文本在界面組件上佔用多少空間,java.awt中的FontMetrics類提供了這樣的方法,即可以確定以指定的字體顯示時字符有多大,通過該類可用於格式化或文本居中。
  • 通過getFontMetrics(Font)來返回一個FontMetrics對象,通過該對象獲取有關當前字體的詳細信息,如字符的寬度和高度
int getHeight() 
          獲取此 Font 中文本行的標準 height。 
 int charWidth(char ch) 
          返回此 Font 中指定字符的 advance width。 
 int stringWidth(String str) 
          返回此 Font 中指定 String 的總 advance width。 

顏色

  • 默認情況下,java根據顏色描述系統sRGB來使用顏色,在這種系統中,顏色用其包含的紅色、綠色和藍色成分來描述的-這正是R、G、B的意思。
  • 要設置當前的繪圖顏色,可以創建一個Color對象來表示它,也可以是使用Color的標準顏色。爲創建顏色對象,可通過兩種不同的方式來調用Color構造函數:
Color(int r, int g, int b) 
          創建具有指定紅色、綠色和藍色值的不透明的 sRGB 顏色,這些值屬於 (0 - 255) 。
Color(float r, float g, float b) 
          創建具有指定紅色、綠色和藍色值的不透明的 sRGB 顏色,這三個顏色值
          都在 (0.0 - 1.0) 的範圍內。
例如
Color c1 =new Color(0.807F,1F,0F);
F代表是個浮點數,不要與十六進制混淆。
Color c2 =new Color(255,204,102);
  • 當前的繪圖顏色可使用類Graphics的setColor()方法來指定。必須對錶示繪製區域的Graphics或Graphics2D對象調用該方法。
  • 設置顏色的方法之一是使用Color中的標準顏色,這些顏色是使用類變量表示的。表示顏色的類變量有black(0,0,0),blue,cyan,darkGray,gray,green。例如g.setColor(Color.pink)(g爲Graphics或Graphics2D對象)。
  • 或者使用Color對象進行繪製
Color brush =new Color(255,204,102);
g.setColor(brush);

設置完顏色後,所有的畫圖操作都將使用該顏色。

  • 可以通過setBackground()設置背景色,getForeground()設置前景色。

繪製直線和多邊形

  • 繪圖方法都是在組件的paintCompoent()方法中調用的。
  • java2D特性包括:
    (1)繪製空的多邊形或用純色填充的多邊形。
    (2)使用特殊的填充圖案,如漸變或圖案。
    (3)定義了畫筆的寬度和樣式。
    (4)通過反走樣來是對象的邊界變得平滑化。

指定渲染屬性

  • 在2D操作時可以指定繪製的對象如何被渲染,繪製非2D對象時,只能選擇一個屬性:顏色。
  • java2D提供了大量的屬性,用於指定顏色、線寬、填充圖案、透明度和其他特徵。

填充圖案

  • 填充圖案控制對象將如何被填充。在java2D中,我們可以使用純色,漸變填充,紋理或者我們自己設計的圖案。
  • 使用Graphics2D的setPaint()方法可以定義填充圖案,該方法接受一個paint對象作爲其唯一的參數,可作爲填充圖案的類包括GradientPaint(漸變填充),TexturePaint(紋理填充),Color(顏色)都實現了接口Paint。
  • 漸變填充指的是從一個座標點上的某種顏色逐漸變化到另一個座標點上的另一種顏色。這種變化可在兩個點間發生一次或多次,發生一次叫做非週期漸變,發生多次叫做週期漸變。
  • 用同一個GradientPaint對象進行填充,得到的圖形未必一樣,用漸變填充的圖形是從布上剪下的圖案,且可以從一塊布上剪切下多塊圖案。
GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2) 
          構造一個簡單的非週期性 GradientPaint 對象。 
GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2, boolean cyclic) 
          根據 boolean 參數構造一個週期性或非週期性的 GradientPaint 對象。 
			x1 - 用戶空間中第一個指定 Point 的 x 座標
			y1 - 用戶空間中第一個指定 Point 的 y 座標
			color1 - 第一個指定 Point 處的 Color
			x2 - 用戶空間中第二個指定 Point 的 x 座標
			y2 - 用戶空間中第二個指定 Point 的 y 座標
			color2 - 第二個指定 Point 處的 Color
			cyclic - 如果漸變模式在兩種顏色之間重複循環,則爲 true;否則爲 false。

設置畫筆

  • 在以前的java版本中,在所有的繪圖操作中繪製直線的寬度都爲1個像素,在java2D中,可以通過setStroke()方法並用BasicStroke作爲參數傳遞給它,來改變繪製的直線的寬度。
BasicStroke(float width, int cap, int join) 
          構造一個具有指定屬性的實心的 BasicStroke。
          width - BasicStroke 的寬度
             表示線寬爲幾個像素
          cap - BasicStroke 端點的裝飾
              決定線段兩端的修飾樣式,可以爲CAP_BUTT(沒有樣式),CAP_ROUND(圓形
              端點),CAP_SQUARE(方形端點)
          join - 應用在路徑線段交匯處的裝飾
              決定線段間的連接樣式,可以爲JOIN_MITER(通過擴展兩條線段的外邊界來將它
              們連接起來)、JOIN_ROUND(將兩條線段圓滑的地連接起來)和JOIN_BEVEL()
              (用一條直線將兩條線段連接起來)

創建要繪製的對象

  • 在java2D中,要繪製的對象是通過使用java.awt.geom包中的類,將其定義爲幾何圖形來創建的。我們可以繪製線段,矩形,橢圓,圓弧和多邊形。
  • 繪製各種圖形時,不是調用Graphics2D類的不同方法;而是定義要繪製的圖形,並將其用作方法draw()和fill()的參數。

線段

  • 線段是通過Line2D.Float或者Line2D.Double來創建的。
Line2D.Float(float x1, float y1, float x2, float y2) 
          根據指定座標構造並初始化 Line。
Line2D.Double(double x1, double y1, double x2, double y2) 
          根據指定座標構造並初始化 Line2D。

例如

Line2D.Float ln =new Line2D.Float(60F,5F,13F,28F);
創建一條端口分別爲(60,5)和(13,28)的線段。

矩形

  • 矩形是使用類Rectangle2D.Float或Rectangle.Double來創建的。這兩個類之間的區別在於:一個接收Float參數,一個接收Double參數。
Rectangle2D.Float(float x, float y, float w, float h) 
          根據指定的 float 座標構造和初始化 Rectangle2D。
Rectangle2D.Double(double x, double y, double w, double h) 
          根據指定的 double 座標構造和初始化 Rectangle2D。

例如

Rectangle2D.Float ee  = new Rectangle2D.Float(113F,25F,22F,40F);
創建一個矩形,左上角座標(113,25),寬度爲22,高度爲40

橢圓

  • 橢圓類是使用類Ellipse2D.Float或Ellipse2D.Double來創建的
Ellipse2D.Float(float x, float y, float w, float h) 
          根據指定座標構造和初始化 Ellipse2D。
Ellipse2D.Double(double x, double y, double w, double h) 
          根據指定座標構造和初始化 Ellipse2D。`

  • 圓弧是使用Arc2D.Float或Arc2D.Double類來創建的
Arc2D.Float(float x, float y, float w, float h, float start, float extent, int type) 
          構造一個新弧,並將其初始化爲指定的位置、大小、角跨越和閉合類型。
        x - 弧的窗體矩形左上角的 X 座標。
		y - 弧的窗體矩形左上角的 Y 座標。
		w - 完整橢圓的總寬度,此弧是該橢圓的一部分。
		h - 完整橢圓的總高度,此弧是該橢圓的一部分。
		start - 弧的起始角度(以度數表示)。
		extent - 弧的角跨越(以度數表示)。
		type - 弧的閉合類型:Arc2D.OPEN、Arc2D.CHORD 或 Arc2D.PIE。

多邊形

  • 在java2D中,多邊形是通過從一個頂點移到另一個頂點來創建的。多邊形可以由直線,二次曲線,和凡賽爾曲線構成。
  • 創建多邊形的運動被定義爲GeneralPath對象。
      GeneralPath polly = new GeneralPath();
  • 使用該對象的moveTo()方法創建多邊形的第一個頂點
       polly.moveTo(5f,0f);
  • 使用LineTo()方法來創建多邊形的邊
     polly.LinTo(205F,0F);
     polly.LinTo(205F,90F);
     polly.LinTo(5F,0F);
     將三條邊加入到polly對象中去
  • 通過closePath()方法可以閉合多邊形
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章