as3學習第二課 顯示對象和顯示列表

來源:互聯網
上載者:User
關於顯示對象 原文地址:as3學習第二課   顯示對象和顯示列表 作者:冰劍藍影

一、顯示對象
   顯示對象就是可以在舞台上顯示的對象。包括直接看到的對象,形、文字、圖片、視頻、還有看不到但又真實存在的容器。
   所有的顯示對象都繼承於flash.dispaly包中的DisplayObject類。而DisplayObject類又繼承自EventDispatcher類,這就意味著所有的顯示對象都可以發送事件。
   根據顯示對象能否接收互動事件(即:是否繼承於interactiveObject類),我們把顯示對象分為可互動和非互動顯示對象。
   所謂接收互動事件,是指能夠接收按一下滑鼠、鍵盤敲擊等人機互動事件。按鈕能夠接收滑鼠事件,所以按鈕就歸屬於可互動顯示對象。而位元影像不能調用滑鼠事件,要想實現調用滑鼠的功能,必須把位元影像放在一個容器裡,所以位元影像就歸屬於非互動顯示對象。
   能夠容納其它顯示對象作為自己的子物件(即是否繼承DisplayObjectContainer類),我們把顯示對象分為顯示對象容器和非容器顯示對象。顯示對象容器包括:Loader、Sprite、Stage和MovieClip,非容器顯示對象包括位元影像、文本、圖形、視頻和按鈕。把一個顯示對象添加到一個容器中使用addChild方法。
   樣本1:建立一個Flash檔案,在舞台上畫一個影片剪輯和按鈕,分別取執行個體名為mc和btn,再建立一個小影片剪輯,執行個體名為mc0。
    第1幀代碼:
mc.addChild(mc0);
mc0.x=mc0.y=0;
   測試影片,可以看到mc0被添加到了mc中。
    把代碼改成:
btn.addChild(mc0);
mc0.x=mc0.y=0;
   測試影片,不但小影片沒有添加到按鈕中,反而拋出一個錯誤:1061: 調用可能未定義的方法 addChild (通過 static 類型flash.display:SimpleButton 引用)。
意思就是說,在定義單純按鈕這個類中並沒有addChild這個方法。
   下面我們來認識幾個對象(類):
Bitmap,位元影像對象。可以通過BitmapData對象來建立,也可以從外部載入。
Shape,形狀對象。專門用來繪製向量圖形。
Video,視頻對象。用來播放Flash視頻,可以來自檔案也可以來自網路流媒體。
SimpleButton,按鈕類對象。在flash中建立按鈕元件的ActionScript形式。
TextField,文字物件。用於文本顯示和輸入的顯示對象。
Loader,載入對象。用來載入和顯示外部的圖片和swf檔案。
Sprite,精靈對象。可以看成是沒有時間軸的MovieClip。在AS3中,很多地方使用Sprite代替MovieClip,因為它是輕量級的容器。
MovieClip,影片剪輯對象。
Stage,舞台。所有的視覺元件都在它裡面,是當之無愧的最終容器。
    二、顯示列表
   在AS3中構建的每個互動應用程式都有一個由顯示對象構成的階層,這個結構稱為“顯示列表”,是螢幕可見顯示內容的階層。什麼意思呢?就是父容器裡面可以有子容器,子容器裡面又可以有子容器,這樣顯示對象在其中就形成了階層。在指令碼中建立的對象,如果不添加到這個層次中,就不會在舞台上顯示。
   所以舞台是這個等級結構的最上層,舞台(Stage)是最根本的容器,包含著當前SWF所有的顯示對象。舞台又是一個特殊的容器,每個應用程式只能有一個Stage對象,作為整個顯示對象結構的根節點。
   舞台下面又是一個容器,被稱為當前SWF主類的執行個體,也就是說,在AS3中,每個SWF檔案都有一個關聯的ActionScript類,該類稱為“SWF檔案的主類”。當這個swf檔案設定了文檔類,那麼這個文檔類就成了主類;如果是由FlashCS4自動產生而沒有指定文檔類,那麼預設的MainTimeline類就是主類。當開啟swf檔案時,FlashPlayer將調用該類的建構函式,所建立的執行個體(始終是一種顯示對象)將添加為Stage對象的子級。swf檔案的主類始終擴充Sprite類。我們可以通過任何顯示對象的stage屬性來訪問舞台。然後才是swf檔案主類對象中建立的顯示對象。
   每個容器和其子物件又可以連成一個局部樹狀圖。也就是說每個容器擁有自己的列表,包含著自己的子物件和子容器。我們一般所講的顯示列表是指從根節點(Stage)開始的。
   我們來驗證一下顯示列表的樹樁結構,通過上節課的樣本1,自下而上,一層一層的尋找mc0上面的容器,在第一幀上寫上:
mc.addChild(mc0);
mc0.x=0;
mc0.y=0;
trace("mc0的父容器是"+mc0.parent);
trace("mc0的爺爺容器是"+mc0.parent.parent);
trace("mc0的爺爺的父容器是"+mc0.parent.parent.parent);
//parent意思是父親,在這裡指父級容器。
//輸出:
mc0的父容器是[object MovieClip]
mc0的爺爺容器是[object MainTimeline]
mc0的爺爺的父容器是[object Stage]
   是不是和列表中顯示的等級結構一摸一樣?
   最後再加上一句代碼:
   trace("mc0的爺爺的爺爺容器是"+mc0.parent.parent.parent.parent);
//輸出:mc0的爺爺的爺爺容器是null。
   說明Stage就是根節點,上面什麼也沒有。
   顯示列表包含應用程式中的所有可視元素。
   一個程式中的顯示對象分為在顯示列表中和不在顯示列表中。顯示列表就是一張清單,只有清單上列出的內容才能在舞台上顯示出來。換句話說,Flash只渲染顯示列表中存在的內容。
   三、建立顯示對象和渲染顯示對象
   在AS3中,建立顯示對象和渲染顯示對象是兩個獨立的過程。建立顯示對象可以用flashCS4建立,也可以用代碼建立。用CS4工具建立對象就是直接在舞台上建立影片剪輯、按鈕或元件。用代碼建立對象的過程稱為執行個體化對象,也就是建立特定類的執行個體。首先得聲明一個變數,然而,聲明變數僅僅是在電腦的記憶體中建立一個空位置,在嘗試使用或操作變數之前,您必須為變數指定實際值(即建立一個對象並將之儲存在變數中)。這時就需要使用new關鍵字加類建構函式。使用new運算子建立對象通常稱為“調用類的建構函式”。建構函式是在建立類的執行個體的過程中調用的一種特殊方法。請注意,當以此方法建立執行個體時,請在類名後加上小括弧,有時還可以指定參數值。
    樣本2:
var circle:Sprite=new Sptiet();
circle.graphics.beginFill(0xffcc00);
circle.graphics.drawCircle(40,40,40);
trace(circle);
   測試影片,輸出面板會輸出[objectSprite],說明這個對象已經存在。new運算子還可用於建立庫中定義、但沒有放在舞台上的影片剪輯元件的執行個體。
    樣本3:
   我們先在情境中畫一個圓,轉化為影片剪輯。再把舞台上的圓刪除,現在庫中已經有這麼一個元件,只不過在new出這個對象之前我們要做一項工作:用滑鼠右鍵單擊庫元件選擇屬性,選擇為“ActionScript匯出”選項打上勾,然後會發現CS4在“類”的輸入欄中自動填入了元件名,我們把它改成Mc,點確定。這時會彈出一個類警告:無法在類路徑中找打對此類的定義,因此將在匯出時自動在swf中產生相應的定義。點確定。我們在第一幀上寫代碼:
var mc:Mc=new Mc();
   測試影片會發現,我們new出來的新對象circle和mc在舞台上並不可見。這是因為我們只建立了這兩個對象但並沒有渲染它們,也就是沒有把它加入到顯示列表。渲染顯示對象,則必須把這個建立的顯示對象添加到顯示列表。Flash程式中所有的顯示對象的添加流程如下:當一個Flash程式運行時,最先自動產生的是Stage容器物件,Stage容器物件是顯示列表中的第一個顯示對象容器。每個Flash程式只能有一個Stage。顯示列表從Stage開始。其次,當第一個SWF檔案被載入後,會自動產生Stage容器的一個子顯示對象,也就是swf檔案主類的執行個體。
   最後,才是swf檔案主類對象中建立的顯示對象,也就是我們用CS4工具建立或者是用代碼建立的顯示對象。FlashPlayer會按照它們加入顯示列表的代碼順序逐一顯示出來。而我們用代碼建立的顯示對象則需要我們用代碼添加到顯示列表中。加入到顯示列表的方法有:
      addChild和addChildAt
   從顯示列表中移除的方法有:
       removeChild和removeChildAt
   addChildAt和removeChildAt這一對方法因為涉及到顯示對象深度的問題,所以先不講。下面就來講講addChild和removeChild這兩個方法。
   addChild方法將一個子顯示對象添加到該顯示對象容器中。子項將被添加到該容器執行個體中其它所有子項的前(上)面。
   removeChild從顯示對象的子列表中刪除指定的顯示對象。
   addChild和removeChild方法的使用格式如下:
   容器物件.addChild(顯示對象);
   容器物件.removeChild(顯示對象);
   我們把樣本3的代碼改成:
var mc:Mc=new Mc();
addChild(mc);
   測試影片,舞台上出現用代碼建立的新對象。如果我們要把顯示對象從列表中移除,只需調用removeChild方法。
removeChild(mc);
   添加和刪除顯示對象應該注意以下幾點:
   第一,addChild和removeChild方法只是顯示對象容器的方法,是容器對子物件所執行的操作。當我們傳入的參數不合理,比如我們要添加的對象就是容器本身或者是容器的父容器,或者要刪除的子物件根本就不在顯示列表中就會報錯。
   第二,一個對象是否在顯示列表中,不會影響顯示對象自身的狀態,比如:座標、透明度、寬、高等屬性。也就是說,即使我們把一個對象從顯示列表中刪除,這個對象依然存在,儘管我們看不到它。我們把樣本3的代碼改成:
var mc:Mc=new Mc();
trace(mc.width);
    輸出:45
   測試影片時我們看不到影片剪輯,因為我們沒有把它放到舞台上,也就是沒有調用addChild方法。雖然mc0不在顯示列表中,但我們還是能夠擷取它的寬。如果我們想徹底刪除這個對象,就把這個對象設定為空白(null)。
   第三,如果添加到顯示列表顯示對象的父容器不在顯示列表中,那麼這個顯示對象不會被顯示,同理,如果在顯示列表中移除父容器,那麼它的子物件也一起被移除。
   第四,顯示對象的座標屬性值是相對於父容器的註冊點的座標,不是絕對座標。父容器不同,則同樣的子顯示對象座標值在螢幕上是位置也會不同。但我們看到在舞台上的位置卻不一樣。
   第五,在把顯示對象添加到顯示列表中時一定要注意一個問題:一個顯示對象只能被添加一次,如果你在同一容器中再次添加它或者是把它添加到其它的容器中,那麼先添加的那個會自動移除。只有最後加入的容器,才會擁有該顯示對象。

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.