Saturday, April 16, 2011

[翻譯文]關於顯示物件的stage屬性引用資料整理

I collected some information here about stage and translated into Traditional Chinese.

------------------------------------

[Adobe Help]
STAGE屬性
語言版本: ActionScript 3.0
執行階段版本: AIR 1.0, Flash Player 9, Flash Lite 4

顯示物件的「舞台」。 Flash 執行階段應用程式只有一個 Stage 物件。例如,您可以建立多個顯示物件並將之載入顯示清單中,如此,每個顯示物件的 stage 屬性都會參照到相同的 Stage 物件 (即使顯示物件屬於載入的 SWF 檔案亦然)。
如果顯示物件未加入顯示清單,它的 stage 屬性便會設為 null。

下列程式碼會建立兩個 TextField 物件,並使用 Stage 物件的 width 屬性來放置文字欄位:

import flash.text.TextField;

var tf1:TextField = new TextField();
tf1.text = "Text Field 1";
tf1.border = true;
tf1.x = 10;
addChild(tf1);
tf1.width = tf1.stage.stageWidth / 2 - 10;

var tf2:TextField = new TextField();
tf2.text = "Text Field 2";
tf2.border = true;
tf2.x = tf1.x + tf1.width + 5;
addChild(tf2);
tf2.width = tf2.stage.stageWidth / 2 - 10;

trace(stage.stageWidth);

[翻譯自 Learning ActionScript 3.0--Beginner's Guide 一書的小註解]

顯示物件通常可以操作於顯示物件加入顯示清單之前或之後。然而,一些顯示物件的屬性或方法可能無效,當物件不在顯示清單中。這種情況的好例子包含root跟stage實體的任何顯示物件。

一旦顯示物件被加到顯示清單中,它的stage與root屬性就是有效的。然而如果物件不是顯示清單的一部分,這些屬性將會返回null。嘗試下面的範例,trace輸出內容寫在註解部分:
var mc:MovieClip = new MovieClip();
trace(mc.stage); //null
trace(mc.root); //null
addChild(mc);
trace(mc.stage); //[object Stage]
trace(mc.root); //[object MainTimeline] 
第一行是創造新的影片元件。然而影片元件還未加到顯示清單中,所以在下兩行都返回null。在影片元件加入顯示清單後,屬性分別返回了Stage跟MainTimeline。

如果你沒先計畫好的話,無效的stage跟root屬性是常見的問題。例如,下面的程式碼想要嘗試將影片元件設定於舞台中間於加入顯示清單之前:
var mc:MovieClip = new MovieClip();
mc.x = mc.stage.stageWidth / 2;
addChild(mc);
這將會失敗,是因為stage屬性是null。要修正這個問題,只要對調最後兩行的程式碼,先將顯示物件加入舞台。

如果你經常將程式碼寫在時間軸的話,這是非常容易發生的問題,因為在舞台看似存在沒有引用一個顯示對象,在下面程式碼將不會看到錯誤:
var mc:MovieClip = new MovieClip();
mc.x = stage.stageWidth / 2;
addChild(mc); 
然而它可運作是因為stage是引用一個顯示物件(this),這只是一個隱含的引用。這是可以說明的,重寫上面第二行之前的程式碼:
mc.x = this.stage.stageWidth / 2;
這程式碼可運行只因為在這個範例中,這個this關鍵字指向的是主時間軸。在FLASH IDE中時間軸永遠自動建立為顯示清單的一部分。這個this關鍵字通常被忽略,但是它在這裡可以使用,說明stage必須始終通過一個顯示物件。




.

No comments:

Post a Comment