(转)AS3中的stage,this,root的区别
要了解這個(gè)問(wèn)題就要先對(duì)flash中的顯示對(duì)象結(jié)構(gòu)有一個(gè)大概的了解:
?
第一級(jí):舞臺(tái);
?
第二級(jí):當(dāng)前SWF;
?
第三級(jí):各種容器及可視對(duì)象(如:文本框,位圖……);
?
以此類(lèi)推…………
?
stage:
?
其中舞臺(tái)(Stage)是最根本的容器,包含當(dāng)前SWF的所有顯示對(duì)象,每個(gè)flash程序只能有一個(gè)舞臺(tái)容器。
?
所有顯示對(duì)象的stage屬性指向舞臺(tái)。
?
root:
?
在舞臺(tái)下面的也是一個(gè)容器,被稱(chēng)作當(dāng)前SWF主類(lèi)的實(shí)例(注:AS3.0中所有容器直接或間接繼承自DisplayObjectContainer類(lèi)),在AS3.0中,每一個(gè)SWF都和一個(gè)類(lèi)相關(guān)聯(lián),這個(gè)類(lèi)就稱(chēng)為SWF的主類(lèi),如果沒(méi)有設(shè)定文檔類(lèi),則MainTimeline類(lèi)(注:MainTimeLine是MovieClip的子類(lèi))就是主類(lèi)。而root就指向當(dāng)前SWF主類(lèi)的實(shí)例(注:在AS2.0中,_root.指代絕對(duì)路徑)。
?
this:
?
this關(guān)鍵字持有對(duì)當(dāng)前對(duì)象的引用,編譯器將this關(guān)鍵字加在類(lèi)中每一個(gè)調(diào)用實(shí)例屬性和實(shí)例方法的地方。
?
this關(guān)鍵字常見(jiàn)使用情況:
?
(1)向第三方提供對(duì)象自身的引用。
?
(2)與return結(jié)合,在類(lèi)方法中返回自身的引用。
?
(3)和局部變量,方法參數(shù),靜態(tài)屬性同名時(shí),加上this關(guān)鍵字明確指定使用實(shí)例屬性。
?
1.STAGE是根,是最頂層的容器!可以通過(guò)STAGE的任何子容器或顯示
?
對(duì)象以DisplayObjectContainer.stage(需注意的是stage是小寫(xiě),如果在時(shí)間軸上trace(stage.width)是正確的,如果寫(xiě)成trace(Stage.width則會(huì)報(bào)錯(cuò)))或DisplayObject.stage訪問(wèn)到Stage類(lèi)的
?
唯一實(shí)例stage.就連主時(shí)間軸也是stage容器的子容器。
例如。你在主時(shí)間軸上寫(xiě)上代碼:trace(this);輸出的是什么呢?因?yàn)槟闶窃谥?/p>
?
時(shí)間軸上寫(xiě)的。所以返回的是一個(gè)對(duì)象:MainTimeLine,也就是主時(shí)間軸了。同
?
志們可以試試在主時(shí)間軸上寫(xiě):trace(this.stage);當(dāng)然輸出的是Stage對(duì)象了
?
。也可以省略不寫(xiě)this,直接寫(xiě):trace(stage);輸出的還是Stage對(duì)象。為了更清
?
楚,在主時(shí)間軸上寫(xiě)上代碼:trace(stage.getChildAt(0));看看輸出的是什么
?
呢?如果是MainTimeLine的話,就更能說(shuō)明問(wèn)題了,主時(shí)間軸是stage容器的第
?
一個(gè)子容器,在索引位置0上。
?
2.stage.width 與stage.stageWidth
?
我記得width相當(dāng)于sprite的width,是stage上所有child構(gòu)成的范圍的寬(
?
沒(méi)東西width就是0),stageWidth就是舞臺(tái)的寬
其實(shí)這個(gè)問(wèn)題很簡(jiǎn)單,但是你為什么不自己用個(gè)兩個(gè)文本框在各種不同的情況下
?
顯示一下這兩個(gè)的值呢。
?
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);
}
?
?
?
自己看看吧,改變一下舞臺(tái)的大小,場(chǎng)景上的東西,還有環(huán)境,縮放,
?
自己試出來(lái)的結(jié)果永遠(yuǎn)比別人講的來(lái)的清晰
?
?
?
3.這兩天看AS3 cookbook和AS3的幫助文檔,里面很多代碼執(zhí)行后都會(huì)出現(xiàn)“TypeError: Error #1009: 無(wú)法訪問(wèn)空對(duì)象引用的屬性或方法。”這個(gè)錯(cuò)誤。幾經(jīng)周折,才知道解決辦法:使用addEventListener( Event.ADDED_TO_STAGE, enterDLHandle ),把要用的stage代碼放到enterDLHandle里面,就沒(méi)問(wèn)題了。不知道有沒(méi)有其他解決方法,知道的說(shuō)聲啊~
?
在經(jīng)典論壇上提問(wèn)這個(gè)問(wèn)題,終于有人做出全面回答了,在此感謝zjs35
?
首先要明白stage是什么意思,stage是顯示對(duì)象的一個(gè)引用舞臺(tái)的屬性,如果顯示對(duì)象不在顯示列表中,即沒(méi)有用addChild()添加,stage等于null,你的問(wèn)題就在這里。
使用stage有下面幾種方法:
1、文檔類(lèi)的構(gòu)造函數(shù)中可以直接使用stage屬性
2、非文檔類(lèi)可以通過(guò)參數(shù)傳遞到類(lèi)里面。
class Test extends Shape
{
function Test(stage:Stage)
{
}
}
3、不想傳遞參數(shù)時(shí),要注意代碼的順序。
class Test extends Shape
{
function Test()
{
}
functon useStage()
{
trace(stage)
}
}
這樣使用
var test=new Test()
test.useStage()//null,你的問(wèn)題出在這里
addChild(test)//添加到顯示列表后,就可以使用stage屬性。
test.useStage()//[object Stage]
總之,理解stage是顯示對(duì)象的屬性,位于顯示列表中的顯示對(duì)象的stage才引用舞臺(tái)
?
AS3.0 中root和parent的用法
一、首先看一下在單個(gè)swf中的用法:
在主舞臺(tái)上的幀上寫(xiě)下如下代碼:
var xxx="this is root";
新建一個(gè)MC,給它一個(gè)實(shí)例名稱(chēng)test_mc1,在test_mc1中的幀上寫(xiě)下如下代碼:
trace(parent["xxx"]);
trace(root["xxx"]);
trace(root["test_mc1"].alpha)
最終的輸出為:
this is root this is root
1
如果在test_mc1中在建立一個(gè)實(shí)例名稱(chēng)為test_mc2的movieclip,如何trace它的alpha呢:
trace(root["test_mc1"].test_mc2.alpha);
最終輸出“1”。
?
二、如果是兩個(gè)swf,他們之間是怎樣操作的呢:
新建兩個(gè)flash文件,命名為a1和a2,
在a1.fla中的幀上寫(xiě)下如下代碼:
var xxx="this is root";
var myloader=new Loader();
myloader.load(new URLRequest("a2.swf"));
addChild(myloader);
在a2.fla中建立一個(gè)動(dòng)態(tài)文本框,實(shí)例名稱(chēng)為txt;
在幀中寫(xiě)下如下代碼:
txt.text=parent.root["xxx"];
分別發(fā)布兩個(gè)flash文件,然后運(yùn)行a1.swf,看到其顯示結(jié)果為"this is root";
在發(fā)布a2.swf是你會(huì)看到:
ReferenceError: Error #1069: 在 flash.display.Stage 上找不到屬性 xxx,且沒(méi)有默認(rèn)值。
at a2_fla::MainTimeline/a2_fla::frame1()
不用去理它,因?yàn)樗皇峭ㄟ^(guò)a1.swf load到場(chǎng)景,所以找不到xxx這個(gè)參數(shù)。
這里的第一個(gè)parent是a1.swf中的myloader,myloader的再上一級(jí)才能找到xxx這個(gè)參數(shù),這里也可以寫(xiě)成parent.parent["xxx"]。
我想通過(guò)這兩個(gè)例子應(yīng)該比較清楚如何在AS3中使用root和parent了。
?
但as3的root在類(lèi)型轉(zhuǎn)換上出現(xiàn)的問(wèn)題具有普遍性
as3的文檔類(lèi)通常使用Sprite或MovieClip,但實(shí)際上繼承DisplayObject的類(lèi),在理論上均可做文檔類(lèi)
故adobe在設(shè)計(jì)root時(shí),
設(shè)計(jì)為root:DisplayObject
?
很多時(shí)候需要使用root as MovieClip來(lái)使用gotoAndStop一類(lèi)腳本 這在前一篇文章中(AS2中的_root,在AS3的用法)已經(jīng)說(shuō)過(guò)了
?
我通過(guò)這段時(shí)間對(duì) AS 3.0 的研究, 發(fā)現(xiàn)下面這個(gè)很有價(jià)值的問(wèn)題, 所以今天寫(xiě)下來(lái), 給大家分享.
?
?
Action Script 2.0 中 this 的用法:
在 Flash 里拖一個(gè) Button 組件到舞臺(tái), 給這個(gè) Button 實(shí)例取個(gè)名字叫 b1, 在 b1 身上添加代碼:
?
[復(fù)制到剪貼板]CODE:on (click) {
this.label = "你點(diǎn)了這個(gè)按鈕一下";
}
?
這里的 this 指的就是 Button 對(duì)象 b1, 點(diǎn)擊 b1 之后, b1的標(biāo)簽馬上變?yōu)?#34;你點(diǎn)了這個(gè)按鈕一下". 也就是說(shuō), 在 AS 2.0 中 this 指的是使用該方法的當(dāng)前對(duì)象.
?
?
Action Script 3.0 中 this 的用法:
在 Flex Builder 的 Design 模式下拖一個(gè) Button 到舞臺(tái), 給這個(gè)實(shí)例取名, 也就是設(shè)置 id 的值, 還是取名 b1, 然后回到 Source 模式下, 添加代碼:
?
[復(fù)制到剪貼板]CODE:<mx:Button id="b1" click="this.label="你點(diǎn)了這個(gè)按鈕一下";"/>
?
當(dāng)你運(yùn)行之后就會(huì)發(fā)現(xiàn), 點(diǎn)了 b1 之后, b1 的標(biāo)簽并沒(méi)有任何改變, 這是因?yàn)? this 關(guān)鍵字并不是指的 b1 這個(gè)按鈕, 而是指的 Application 的實(shí)例, 所以, 點(diǎn)了按鈕之后, 實(shí)際上企圖修改的是 Application 的標(biāo)簽, 而不是 b1 這個(gè)按鈕的標(biāo)簽.
?
因此正確的代碼應(yīng)該是:
?
[復(fù)制到剪貼板]CODE:<mx:Button id="b1" click="b1.label="你點(diǎn)了這個(gè)按鈕一下";"/>
?
原因是這樣的: 每個(gè) MXML Application 在保存以后, 實(shí)際上都被編譯成了一個(gè) AS 3.0 的類(lèi)(類(lèi)名跟 MXML 文件名相同), this 指的是這個(gè)類(lèi)本身的實(shí)例, 所以 this 的用法跟 AS 2.0 大相徑庭, 完全兩碼事.
?
?
總之, 在 AS 3.0 中, this 永遠(yuǎn)是指當(dāng)前頂級(jí)類(lèi)的一個(gè)實(shí)例(對(duì)象), 細(xì)分下面幾種情況:
?
1. 在 MXML Applcation 文件中, this 永遠(yuǎn)指的是 Application 的實(shí)例;
?
2. 在 MXML Component 文件中, this 永遠(yuǎn)指的是 Componet 的實(shí)例, 也就是這個(gè)文件中根元素的實(shí)例;
?
3. 在 Action Script Class 文件中, this 永遠(yuǎn)指的是這個(gè) Class 的實(shí)例;
?
4. 如果 MXML Component 和 Action Script Class 都被導(dǎo)入到 MXML Applcation 中, 在這個(gè) MXML Applcation 里 this 關(guān)鍵字依然還是指 Application 的實(shí)例, 而不是其中任何子元素的實(shí)例.
?
好了, 這就是我最近研究 AS 3.0 發(fā)現(xiàn)的一個(gè)典型問(wèn)題, 希望對(duì)大家有幫助 :-)
?
轉(zhuǎn)載于:https://www.cnblogs.com/wonderKK/archive/2012/05/14/2498911.html
總結(jié)
以上是生活随笔為你收集整理的(转)AS3中的stage,this,root的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 利用Tushare获取股票数据(全面详细
- 下一篇: SCOPE_IDENTITY和@@ide