使用 Rectangle 物件

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

Rectangle 物件會定義矩形區域,它的位置是由本身左上角的 x y 座標,以及 width height 屬性所定義。您可以呼叫 Rectangle() 建構函式,定義新 Rectangle 物件的這些屬性,如下所示:

import flash.geom.Rectangle; 
var rx:Number = 0; 
var ry:Number = 0; 
var rwidth:Number = 100; 
var rheight:Number = 50; 
var rect1:Rectangle = new Rectangle(rx, ry, rwidth, rheight);

調整 Rectangle 物件的大小及位置

您可以使用多種方式來調整 Rectangle 物件的大小及位置。

您可以直接變更 Rectangle 物件的 x y 屬性,來調整該物件的位置。此變更並不會影響 Rectangle 物件的寬度或高度。

import flash.geom.Rectangle; 
var x1:Number = 0; 
var y1:Number = 0; 
var width1:Number = 100; 
var height1:Number = 50; 
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); 
trace(rect1) // (x=0, y=0, w=100, h=50) 
rect1.x = 20;  
rect1.y = 30; 
trace(rect1); // (x=20, y=30, w=100, h=50)

顯示以下程式碼時,在您變更 Rectangle 物件的 left top 屬性後,就會重新定位矩形。矩形的 x y 屬性分別符合 left top 屬性。但是,由於 Rectangle 物件的左下角位置不會更改,因此它的大小會改變:

import flash.geom.Rectangle; 
var x1:Number = 0; 
var y1:Number = 0; 
var width1:Number = 100; 
var height1:Number = 50; 
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); 
trace(rect1) // (x=0, y=0, w=100, h=50) 
rect1.left = 20;  
rect1.top = 30; 
trace(rect1); // (x=20, y=30, w=80, h=20)

同樣地,如下列範例所示,若您變更 Rectangle 物件的 bottom right 屬性,它的左上角位置不會更改。矩形會隨之調整大小。

import flash.geom.Rectangle; 
var x1:Number = 0; 
var y1:Number = 0; 
var width1:Number = 100; 
var height1:Number = 50; 
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); 
trace(rect1) // (x=0, y=0, w=100, h=50) 
rect1.right = 60; 
trect1.bottom = 20;  
trace(rect1); // (x=0, y=0, w=60, h=20)

您也可以使用 offset() 方法,重新調整 Rectangle 物件的位置,如下所示:

import flash.geom.Rectangle; 
var x1:Number = 0; 
var y1:Number = 0; 
var width1:Number = 100; 
var height1:Number = 50; 
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); 
trace(rect1) // (x=0, y=0, w=100, h=50) 
rect1.offset(20, 30);  
trace(rect1); // (x=20, y=30, w=100, h=50)

offsetPt() 方法具有相似的運作方式,不過它會使用 Point 物件做為它的參數,而非使用 x y 偏移值。

您也可以使用 inflate() 方法 (包含 dx dy 兩個參數),調整 Rectangle 物件的大小。 dx 參數代表像素的數目,也就是矩形從中心點往左方或右方移動的距離。 dy 參數代表像素的數目,也就是矩形從中心點往上方或下方移動的距離。

import flash.geom.Rectangle; 
var x1:Number = 0; 
var y1:Number = 0; 
var width1:Number = 100; 
var height1:Number = 50; 
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1); 
trace(rect1) // (x=0, y=0, w=100, h=50) 
rect1.inflate(6,4);  
trace(rect1); // (x=-6, y=-4, w=112, h=58)

inflatePt() 方法也具有相似的運作方式,不過它會使用 Point 物件做為它的參數,而非使用 dx dy 值。

找出 Rectangle 物件的聯集與交集

您可以使用 union() 方法,找出兩個矩形邊界所聯合形成的矩形區域:

import flash.display.*; 
import flash.geom.Rectangle; 
var rect1:Rectangle = new Rectangle(0, 0, 100, 100); 
trace(rect1); // (x=0, y=0, w=100, h=100) 
var rect2:Rectangle = new Rectangle(120, 60, 100, 100); 
trace(rect2); // (x=120, y=60, w=100, h=100) 
trace(rect1.union(rect2)); // (x=0, y=0, w=220, h=160)

您可以使用 intersection() 方法,找出兩個矩形互相重疊所形成的矩形區域:

import flash.display.*; 
import flash.geom.Rectangle; 
var rect1:Rectangle = new Rectangle(0, 0, 100, 100); 
trace(rect1); // (x=0, y=0, w=100, h=100) 
var rect2:Rectangle = new Rectangle(80, 60, 100, 100); 
trace(rect2); // (x=120, y=60, w=100, h=100) 
trace(rect1.intersection(rect2)); // (x=80, y=60, w=20, h=40)

您可以使用 intersects() 方法,得知兩個矩形是否互相交集。您也可以使用 intersects() 方法,得知某個顯示物件是否位於「舞台」的特定區域中。至於以下的程式碼範例,假設顯示物件容器 (其中包含 circle 物件) 的座標空間與「舞台」的座標空間相同。此範例將示範如何使用 intersects() 方法,判斷顯示物件 circle 是否與「舞台」上 target1 target2 Rectangle 物件所指定的區域有交集:

import flash.display.*; 
import flash.geom.Rectangle; 
var circle:Shape = new Shape(); 
circle.graphics.lineStyle(2, 0xFF0000); 
circle.graphics.drawCircle(250, 250, 100); 
addChild(circle); 
var circleBounds:Rectangle = circle.getBounds(stage); 
var target1:Rectangle = new Rectangle(0, 0, 100, 100); 
trace(circleBounds.intersects(target1)); // false 
var target2:Rectangle = new Rectangle(0, 0, 300, 300); 
trace(circleBounds.intersects(target2)); // true

同樣地,您可以使用 intersects() 方法,得知兩個顯示物件的矩形邊界是否重疊。請使用 DisplayObject 類別的 getRect() 方法,將其它任何空間 (顯示物件的筆畫會將此空間加入至區域邊界) 納入。

Rectangle 物件的其它用法

下列方法和屬性都會用到 Rectangle 物件:

類別

方法或屬性

說明

BitmapData

applyFilter()、colorTransform()、copyChannel()、copyPixels()、draw()、drawWithQuality()、encode()、fillRect()、generateFilterRect()、getColorBoundsRect()、getPixels()、merge()、paletteMap()、pixelDissolve(), setPixels() 以及 threshold()

當做某些參數的類型來使用,以定義 BitmapData 物件的區域。

DisplayObject

getBounds()、getRect()、scrollRect、scale9Grid

當做屬性的資料類型或是傳回的資料類型來使用。

PrintJob

addPage()

用來定義 printArea 參數。

Sprite

startDrag()

用來定義 bounds 參數。

TextField

getCharBoundaries()

當做傳回值類型來使用。

Transform

pixelBounds

當做資料類型來使用。