(轉)AS3中的stage,this,root的區別

要了解這個問題就要先對flash中的顯示對象結構有一個大概的了解:

?

第一級:舞臺;

?

第二級:當前SWF;

?

第三級:各種容器及可視對象(如:文本框,位圖……);

?

以此類推…………

?

stage:

?

其中舞臺(Stage)是最根本的容器,包含當前SWF的所有顯示對象,每個flash程序只能有一個舞臺容器。

?

所有顯示對象的stage屬性指向舞臺。

?

root:

?

在舞臺下面的也是一個容器,被稱作當前SWF主類的實例(注:AS3.0中所有容器直接或間接繼承自DisplayObjectContainer類),在AS3.0中,每一個SWF都和一個類相關聯,這個類就稱為SWF的主類,如果沒有設定文檔類,則MainTimeline類(注:MainTimeLine是MovieClip的子類)就是主類。而root就指向當前SWF主類的實例(注:在AS2.0中,_root.指代絕對路徑)。

?

this:

?

this關鍵字持有對當前對象的引用,編譯器將this關鍵字加在類中每一個調用實例屬性和實例方法的地方。

?

this關鍵字常見使用情況:

?

(1)向第三方提供對象自身的引用。

?

(2)與return結合,在類方法中返回自身的引用。

?

(3)和局部變量,方法參數,靜態屬性同名時,加上this關鍵字明確指定使用實例屬性。

?

1.STAGE是根,是最頂層的容器!可以通過STAGE的任何子容器或顯示

?

對象以DisplayObjectContainer.stage(需注意的是stage是小寫,如果在時間軸上trace(stage.width)是正確的,如果寫成trace(Stage.width則會報錯))或DisplayObject.stage訪問到Stage類的

?

唯一實例stage.就連主時間軸也是stage容器的子容器。

例如。你在主時間軸上寫上代碼:trace(this);輸出的是什么呢?因為你是在主

?

時間軸上寫的。所以返回的是一個對象:MainTimeLine,也就是主時間軸了。同

?

志們可以試試在主時間軸上寫:trace(this.stage);當然輸出的是Stage對象了

?

。也可以省略不寫this,直接寫:trace(stage);輸出的還是Stage對象。為了更清

?

楚,在主時間軸上寫上代碼:trace(stage.getChildAt(0));看看輸出的是什么

?

呢?如果是MainTimeLine的話,就更能說明問題了,主時間軸是stage容器的第

?

一個子容器,在索引位置0上。

?

2.stage.width 與stage.stageWidth

?

我記得width相當于sprite的width,是stage上所有child構成的范圍的寬(

?

沒東西width就是0),stageWidth就是舞臺的寬

其實這個問題很簡單,但是你為什么不自己用個兩個文本框在各種不同的情況下

?

顯示一下這兩個的值呢。

?

Java代碼

1.stage.addEventListener(MouseEvent.CLICK,update);??

2.?

3.function update(e)??

4.{??

5.?? txt.text = String(stage.stageWidth);??

6.?

7.?? txt1.text = String(stage.width);??

8.}?

stage.addEventListener(MouseEvent.CLICK,update);

?

function update(e)

{

?? txt.text = String(stage.stageWidth);

?

?? txt1.text = String(stage.width);

}

?

?

?

自己看看吧,改變一下舞臺的大小,場景上的東西,還有環境,縮放,

?

自己試出來的結果永遠比別人講的來的清晰

?

?

?

3.這兩天看AS3 cookbook和AS3的幫助文檔,里面很多代碼執行后都會出現“TypeError: Error #1009: 無法訪問空對象引用的屬性或方法。”這個錯誤。幾經周折,才知道解決辦法:使用addEventListener( Event.ADDED_TO_STAGE, enterDLHandle ),把要用的stage代碼放到enterDLHandle里面,就沒問題了。不知道有沒有其他解決方法,知道的說聲啊~

?

在經典論壇上提問這個問題,終于有人做出全面回答了,在此感謝zjs35

?

首先要明白stage是什么意思,stage是顯示對象的一個引用舞臺的屬性,如果顯示對象不在顯示列表中,即沒有用addChild()添加,stage等于null,你的問題就在這里。

使用stage有下面幾種方法:

1、文檔類的構造函數中可以直接使用stage屬性

2、非文檔類可以通過參數傳遞到類里面。

class Test extends Shape

{

function Test(stage:Stage)

{

}

}

3、不想傳遞參數時,要注意代碼的順序。

class Test extends Shape

{

function Test()

{

}

functon useStage()

{

trace(stage)

}

}

這樣使用

var test=new Test()

test.useStage()//null,你的問題出在這里

addChild(test)//添加到顯示列表后,就可以使用stage屬性。

test.useStage()//[object Stage]

總之,理解stage是顯示對象的屬性,位于顯示列表中的顯示對象的stage才引用舞臺

?

AS3.0 中root和parent的用法

一、首先看一下在單個swf中的用法:

在主舞臺上的幀上寫下如下代碼:

var xxx="this is root";

新建一個MC,給它一個實例名稱test_mc1,在test_mc1中的幀上寫下如下代碼:

trace(parent["xxx"]);

trace(root["xxx"]);

trace(root["test_mc1"].alpha)

最終的輸出為:

this is root this is root

1

如果在test_mc1中在建立一個實例名稱為test_mc2的movieclip,如何trace它的alpha呢:

trace(root["test_mc1"].test_mc2.alpha);

最終輸出“1”。

?

二、如果是兩個swf,他們之間是怎樣操作的呢:

新建兩個flash文件,命名為a1和a2,

在a1.fla中的幀上寫下如下代碼:

var xxx="this is root";

var myloader=new Loader();

myloader.load(new URLRequest("a2.swf"));

addChild(myloader);

在a2.fla中建立一個動態文本框,實例名稱為txt;

在幀中寫下如下代碼:

txt.text=parent.root["xxx"];

分別發布兩個flash文件,然后運行a1.swf,看到其顯示結果為"this is root";

在發布a2.swf是你會看到:

ReferenceError: Error #1069: 在 flash.display.Stage 上找不到屬性 xxx,且沒有默認值。

at a2_fla::MainTimeline/a2_fla::frame1()

不用去理它,因為他不是通過a1.swf load到場景,所以找不到xxx這個參數。

這里的第一個parent是a1.swf中的myloader,myloader的再上一級才能找到xxx這個參數,這里也可以寫成parent.parent["xxx"]。

我想通過這兩個例子應該比較清楚如何在AS3中使用root和parent了。

?

但as3的root在類型轉換上出現的問題具有普遍性

as3的文檔類通常使用Sprite或MovieClip,但實際上繼承DisplayObject的類,在理論上均可做文檔類

故adobe在設計root時,

設計為root:DisplayObject

?

很多時候需要使用root as MovieClip來使用gotoAndStop一類腳本 這在前一篇文章中(AS2中的_root,在AS3的用法)已經說過了

?

我通過這段時間對 AS 3.0 的研究, 發現下面這個很有價值的問題, 所以今天寫下來, 給大家分享.

?

?

Action Script 2.0 中 this 的用法:

在 Flash 里拖一個 Button 組件到舞臺, 給這個 Button 實例取個名字叫 b1, 在 b1 身上添加代碼:

?

[復制到剪貼板]CODE:on (click) {

this.label = "你點了這個按鈕一下";

}

?

這里的 this 指的就是 Button 對象 b1, 點擊 b1 之后, b1的標簽馬上變為"你點了這個按鈕一下". 也就是說, 在 AS 2.0 中 this 指的是使用該方法的當前對象.

?

?

Action Script 3.0 中 this 的用法:

在 Flex Builder 的 Design 模式下拖一個 Button 到舞臺, 給這個實例取名, 也就是設置 id 的值, 還是取名 b1, 然后回到 Source 模式下, 添加代碼:

?

[復制到剪貼板]CODE:<mx:Button id="b1" click="this.label="你點了這個按鈕一下";"/>

?

當你運行之后就會發現, 點了 b1 之后, b1 的標簽并沒有任何改變, 這是因為, this 關鍵字并不是指的 b1 這個按鈕, 而是指的 Application 的實例, 所以, 點了按鈕之后, 實際上企圖修改的是 Application 的標簽, 而不是 b1 這個按鈕的標簽.

?

因此正確的代碼應該是:

?

[復制到剪貼板]CODE:<mx:Button id="b1" click="b1.label="你點了這個按鈕一下";"/>

?

原因是這樣的: 每個 MXML Application 在保存以后, 實際上都被編譯成了一個 AS 3.0 的類(類名跟 MXML 文件名相同), this 指的是這個類本身的實例, 所以 this 的用法跟 AS 2.0 大相徑庭, 完全兩碼事.

?

?

總之, 在 AS 3.0 中, this 永遠是指當前頂級類的一個實例(對象), 細分下面幾種情況:

?

1. 在 MXML Applcation 文件中, this 永遠指的是 Application 的實例;

?

2. 在 MXML Component 文件中, this 永遠指的是 Componet 的實例, 也就是這個文件中根元素的實例;

?

3. 在 Action Script Class 文件中, this 永遠指的是這個 Class 的實例;

?

4. 如果 MXML Component 和 Action Script Class 都被導入到 MXML Applcation 中, 在這個 MXML Applcation 里 this 關鍵字依然還是指 Application 的實例, 而不是其中任何子元素的實例.

?

好了, 這就是我最近研究 AS 3.0 發現的一個典型問題, 希望對大家有幫助 :-)

?

轉載于:https://www.cnblogs.com/wonderKK/archive/2012/05/14/2498911.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274813.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試官是怎樣高效面試的(面試官的“套路”

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列最近正…

微服務負載均衡實現高可用_使用負載平衡實現大容量可用性

微服務負載均衡實現高可用Written by Yona Gidalevitz由Yona Gidalevitz撰寫 Most users of the web are blissfully unaware of the sheer scale of the process responsible for bringing content across the Internet. There are literally miles of Internet between you …

Visual Studio 2008自帶的Windows 系統使用的各種圖標、光標和動畫文件

1&#xff0c;Visual Studio 2008自帶的1000多個 Windows 系統使用的各種圖標、光標和動畫文件 在Visual Studio 2008的安裝目錄下&#xff0c; /Microsoft Visual Studio 9.0/Common7/VS2008ImageLibrary/2052文件夾下面&#xff0c;有一個VS2008ImageLibrary.zip&#xff0c;…

Android中導入第三方jar

右鍵工程&#xff0c;Build path,Java build path,選擇libraries在右邊的按鈕中點擊“Add Library”選擇“User library”,點擊“下一步”點擊“User librarys”按鈕在出現的界面中點擊“New..”按鈕在彈出的界面中隨便起一個名字&#xff0c;點擊“確定”點擊“Add jars”按鈕…

19歲中專學歷是怎么在廣州找到前端工作的?

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列本文來…

tcp 接收端優雅的寫法_如何更優雅地接收設計反饋

tcp 接收端優雅的寫法重點 (Top highlight)It’s rare to meet a designer that doesn’t take pride in their work. After all, we are creatives and it’s what we love to do. Although design is teachable, there is a bit of natural skill and talent that comes into…

C++頭文件一覽表

傳統 C   #include <assert.h>    //設定插入點   #include <ctype.h>//字符處理   #include <errno.h>//定義錯誤碼   #include <float.h>//浮點數處理   #include <fstream.h>//文件輸入&#xff0f;輸出   #include &l…

一份 2.5k star 的《React 開發思想綱領》

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列翻譯自…

asp.net生成jason給js

[WebMethod(EnableSession true)][ScriptMethod]public static object TEST(string testval){int type 0;string message "";int precent 0;return new { type type, message message, precent precent };} 轉載于:https://www.cnblogs.com/bulege/archive/20…

文案寫作軟件_11種可改善網站用戶體驗的文案寫作技術

文案寫作軟件Written by John Stevens約翰史蒂文斯 ( John Stevens)撰寫 When we talk about user experience and your website, it is easy to get caught up in the site’s design and navigation options. While that is important, the words you place on the page are…

Table.Rows.Remove(dr)和Table.Delete()的區別

一個DataRow對象剛被創建之后其狀態是Detached&#xff0c;是孤立的一個存在&#xff0c;所以建立了DataRow之后在DataRow中的單元填充了數據后還要通過DataTable.Rows.Add(DataRow)方法將此DataRow添加到DataTable&#xff0c;DataRow添加到DataTable后, 這個DataRow的狀態就…

張小龍談用戶體驗

原文&#xff1a;http://sd.csdn.net/a/20120510/2805483.html從Foxmail到騰訊“七星級產品”QQ郵箱&#xff0c;再到騰訊核武器級產品微信。在外界看來&#xff0c;騰訊副總裁、廣州研發部總經理張小龍作風低調&#xff0c;很少接受正式的媒體采訪。然而作為當今國內最優秀的產…

如何高效學習前端新知識,我推薦這些~

眾所周知&#xff0c;關注公眾號可以了解學習掌握技術方向&#xff0c;學習優質好文&#xff0c;落實到自己項目中。還可以結交圈內好友&#xff0c;讓自己融入到積極上進的技術氛圍&#xff0c;促進自己的技術提升。話不多說&#xff0c;推薦這些優質前端公眾號前端之神100w閱…

web開發集成數字證書_每個數字設計師都應該知道的Web開發的七個原則

web開發集成數字證書A career path into digital design is often winding, meaning many practitioners come from adjacent fields as diverse as graphic design, web development, research, or even anthropology. As a result, two people working in a similar role may…

【轉】CentOS 6.6 升級GCC G++ (當前最新版本為v6.1.0) (完整)

原文地址&#xff1a;https://www.cnblogs.com/lzpong/p/5755678.html 我這里是centos7 升級到gcc8.1&#xff0c;過程差不多&#xff0c;參考這篇文章&#xff0c;記錄一下。 ---原文--- CentOS 6.6 升級GCC G (當前最新GCC/G版本為v6.1.0) 沒有便捷方式, yum update.... yu…

Hadoop:mapreduce的splitsize和blocksize

參考&#xff1a; Hadoop MapReduce中如何處理跨行Block和UnputSplit https://stackoverflow.com/questions/17727468/hadoop-input-split-size-vs-block-size https://stackoverflow.com/questions/30549261/split-size-vs-block-size-in-hadoop轉載于:https://www.cnblogs.co…

前端工程師生產環境 debugger 技巧

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列導言開…

bmp轉jpg(使用libjpeg)

jpg壓縮原理可以參考這篇文章http://hi.baidu.com/tiandsp/item/f5a2dcde6ef1405bd73aae41&#xff0c;我很早以前轉的一篇文章。 沒有使用libjpeg的壓縮代碼可以看看這篇文章http://hi.baidu.com/tiandsp/item/9b5843c58a3b4474cfd4f841&#xff0c;也是我很早以前轉的。 這次…

figma設計_Figma與Adobe XD:我們如何選擇下一個設計工具

figma設計The time came for changes and our design team started raising the topic again about how we should consider moving away from Sketch. This is not the first time this question came to mind, but this time seems like it was serious. Last summer we cons…

一個小廠前端 Leader 如何篩選候選人?

大家好&#xff0c;我是若川。持續組織了8個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列本文作…