咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          as3顯示對象DisplayObject

          Posted on 2008-04-08 12:11 oathleo 閱讀(2329) 評論(0)  編輯  收藏

          AS3里所有能在舞臺(Stage)上看到的東西都繼承自 DisplayObject 。如果讓它最終顯示出來還需要使用某個 DisplayObjectContainer 的addChild() 或者 addChildAt() 方法把它加到顯示列表(display list)里。看看圖示:
          1.jpg
            顯示列表的最根部是 Stage 。Stage 是一個 DisplayObjectContainer ,所有的可見對象是它的 child 或者 child 的 child 。在一個文檔的第一幀輸入代碼:

          trace(stage.getChildAt(0));

          輸出類似于“[object Timeline0_94f120f8fa23a64ca3a80eab162a99a]”。下劃線后面的字符串是隨機的,每次都不同。刪掉時間軸上的代碼,綁定文檔到一個自定義類,如 TestStage :

          package{
          import flash.display.Sprite;? ?
          public dynamic class TestStage extends Sprite{
          public function TestStage(){
          trace(stage.getChildAt(0));
          }
          }
          }

          輸出:“[object TestStage]”。可見,F(xiàn)lash IDE 的默認編輯環(huán)境,也就是 AS2 里的 _root ,現(xiàn)在是 Stage 的第一個 child 。注意上面的代碼,我把 TestStage 類定義為 dynamic :

          public dynamic class TestStage extends Sprite{

          AS3 里 DisplayObject 不是動態(tài)類,所以如果想像以前那樣使用點語法(mc1.mc2.txt1.text)或者 getChildByName() 方法訪問 Flash IDE 創(chuàng)建的 MC ,必須把類定義為動態(tài),不然會報錯:
          “ReferenceError: Error #1056: Cannot create property test_mc on TestStage.”
            現(xiàn)在在 Flash IDE 舞臺上隨便創(chuàng)建一個影片剪輯,命名為 test_mc ,修改上面的 trace 代碼為

          trace(stage.getChildAt(0).test_mc.name);

          輸出:“test_mc”。
          在 AS2 里訪問同樣的 MC 代碼為:

          trace(_root.test_mc.name);

          stage.getChildAt(0) 就是舞臺場景或者我們綁定的文檔類。所以在文檔類里我們直接

          trace(this.test_mc.name);

          在時間軸上也可以使用同樣的代碼,就像過去一樣。
            當然,前面提到,Stage 是一個 DisplayObjectContainer ,所以它有 addChild() 和 addChildAt() 方法。如果使用

          //var stage_mc:Sprite = new Sprite();...
          stage.addChild(stage_mc) ;

          將可以看到在舞臺或者文檔類中創(chuàng)建的所有東西都在這個新加的 stage_mc 之下。如果是

          stage.addChildAt(stage_mc,0);

          所有的東西將在這個 stage_mc 之上,_root 在這里將相當于 stage.getChildAt(1) 了。這在下面會討論到。
            下面用一張圖來加深對 DisplayObjectContainer 的理解,這是一個裝載了不同 DisplayObject 的 DisplayObjectContainer 。
          2.jpg
          那么究竟有哪些類是 DisplayObjectContainer ?直接繼承 DisplayObjectContainer 的有 Loader, Sprite, Stage 。那么它們和它們所有的子類(Sprite 的子類 MovieClip,DownloadProgressBar 等以及它們的子類)都將是 DisplayObjectContainer ,可以使用 addChild() 和 addChildAt() 方法加載 DisplayObject (DisplayObjectContainer 也繼承 DisplayObject) :

            最后來看看 AS3 中的層管理。它是完全自動的。當使用 addChild() 方法把 DisplayObject 加到一個 DisplayObjectContainer 的 display list ,它將自動獲得從0開始的連續(xù)的 index 。于是你可以用 getChildAt(0) , getChildAt(1) … 分別獲得第一個、第二個…加入顯示列表(display list)的 DisplayObject ,這比 getChildByName() 方法更有效率。如果使用 addChildAt() 方法把一個 DisplayObject 加到一個已經(jīng)存在的層,如上面提到的

          stage.addChildAt(stage_mc,0);

          那么該層原有的以及所有該層之上的內(nèi)容都自動上移一層(index + 1)。同樣的,當使用 removeChild() 或 removeChildAt() 方法刪除某一層的顯示內(nèi)容,所有該層之上的內(nèi)容都會自動下移一層(index - 1)。注意 index 始終是連續(xù)的,如果現(xiàn)在的 numChildren 是4,也就是現(xiàn)有最大的 index 是3(0,1,2,3),你將不能 addChildAt(mc,5) 或者任何比5更高的層,編譯器將報錯:
          “RangeError: Error #2006: The supplied index is out of bounds.”
            最后提一下,所有的 DisplayObject 都有一個 stage 屬性指向 Stage ,使用它的前提是該 DisplayObject 已經(jīng)加入某個 DisplayObjectContainer 的 display list ,不然返回的將是 null 。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 耿马| 嘉义县| 宁陵县| 广昌县| 贵溪市| 太原市| 鄂尔多斯市| 宁乡县| 邢台市| 南京市| 特克斯县| 上林县| 麻江县| 嘉定区| 都安| 天峨县| 东安县| 上杭县| 金寨县| 丹东市| 循化| 望江县| 富源县| 邵阳县| 长汀县| 麻阳| 闻喜县| 潼南县| 长宁县| 平武县| 山丹县| 平陆县| 涿鹿县| 阳山县| 沿河| 泾源县| 彰化市| 法库县| 阳谷县| 扎囊县| 聂拉木县|