As3.0 xml + Loader

作者: Mirage

性質: 原創

閱讀次數: 21297

發表時間: 2007-12-13 14:25:12


山东20选5最新开奖结果 www.vyjto.com 一個適合菜鳥級的教程--------------------------Mirage
//www.vyjto.com/forum/showthread.php?t=2502

      上面的地址是曾經也就是剛剛過去的一個月前學習AS2.0的時候有感而發寫的烏七八糟,而這些日子開始著手3.0了咬牙切齒的要自己找回在 2.0上所會的,于是乎冒出個這么東東,其實這兩個東東表現的效果是一樣的,只是編寫的腳本不一樣了。我很欣慰。。。。總算是找回來了點。


     好了現在說一下它的內容吧,其實很簡單是兩部分組成的,只是兩個MC,rejigger_mc和loadPic_mc,前者是負責加載XML以及如何顯示圖片的整個SWF的主干,而后者只是為了加載圖片顯示進度的一個小零件。

    以前2.0時,我把代碼分別寫在rejigger_mc和loadPic_mc的時間軸上,然后在rejigger_mc里黏貼N多個 loadPic_mc,可現在不行啦,他們不讓我那么做,我只好把代碼寫在兩個rejigger_mc.as和loadPic_mc.as外部文件里。
    注:這些文件的布局如下,文件夾ActionScript里含rejigger_mc.as和loadPic_mc.as

/media/upload/2007/12/13/as3_xml_loader/1.jpg

我以混亂的思維淺薄的學識來聊聊我寫的東西。。。。首先是loadPic_mc.as文件

package ActionScript{//包是什么,我的理解它就是文件夾,不就是為了完全限定名稱嗎
    import flash.net.URLRequest;
    import flash.display.Loader;
    import flash.events.*;
    import flash.display.MovieClip;
    import flash.text.TextField;
    import fl.transitions.Tween;
    import fl.transitions.easing.Back;
    import fl.transitions.TweenEvent;
//變了啊,真的變了,現在用什么東西都得沖人家張口借,盡管是免費的,我曾經偷//偷地在所關聯的MC里放了一個文本框,結果還是被發現了,你說我和FLASH打//了多少年的交道,多多少少有點感情吧??,最后我不得不import flash.text.TextField;

    public class loadPic_mc extends MovieClip {
        //類名原來就是腳本文件名
        public var fun:Function;
        //定義了一個屬性他的再次出現在最后一行
        private var per_txt:TextField;
        //顯示加載進度
        private var loadPic:Loader;
        private var dispatcher:IEventDispatcher;
        //上面的這些變量曾經我是聲明在主時間軸的最頂端的
        public function loadPic_mc(str:String):void {//構造函數,現在完全多了個這個東東,據我觀察,當你聲明一個類時,不管你愿不愿意它都會執行這個函數
            var request:URLRequest=new URLRequest(str);
            loadPic=new Loader();

            dispatcher=loadPic.contentLoaderInfo;
            dispatcher.addEventListener(Event.COMPLETE,loadComH);
            dispatcher.addEventListener(Event.OPEN,loadOpenH);
            dispatcher.addEventListener(ProgressEvent.PROGRESS,loadProgH);
            //訂閱事件呢
            loadPic.load(request);
            //一個載入多寫了幾行,要是從3.0轉型到2.0那該多快
            

            per_txt=new TextField();
            per_txt.x=10;
            per_txt.y=55;
            per_txt.width=150;
            per_txt.textColor=0xB3CCCC;
            this.motionLoad_mc.visible=false;
//在loadPic_mc的舞臺上所含的一個MC,有時間軸的
            this.addChild(loadPic);
            //曾經用this指東指西的,現在呢,不能再亂指了,只能指本類,
            this.addChild(per_txt);
        }
        private function loadOpenH(event:Event):void {
            this.motionLoad_mc.visible=true;
            per_txt.text="正在載入。。。。";
            loadPic.alpha=0;
            //開始下載時調度
        }
        private function loadProgH(event:ProgressEvent):void {
            per_txt.text="已載入。。。。"+uint(event.bytesLoaded/event.bytesTotal*100)+"%";
            //下載過程中調度

        }
        private function loadComH(event:Event):void {
            var aTween:Tween = new Tween( loadPic, "alpha", Back.easeOut,0, 1, 2, true);
             aTween.addEventListener(TweenEvent.MOTION_FINISH,disPic);
            //其實完全沒必要訂閱這個事件,只是想聯系一下Tween類
            this.removeChild(this.motionLoad_mc);
            this.removeChild(per_txt);
            //顯示對象很帥吧以后就再也不要_mc[newmc+”I”]去找對象了

            dispatcher.removeEventListener(Event.COMPLETE,loadComH);
            dispatcher.removeEventListener(Event.OPEN,loadOpenH);
            dispatcher.removeEventListener(ProgressEvent.PROGRESS,loadProgH);
            //清除監聽,便于處理垃圾
        }
        private function disPic(event:TweenEvent){
            fun();
            //調用函數fun
        }
    }
}
//寫完此類了  其實3.0語言一看很有層次感的,8錯8錯

下面在庫里找到loadPic_mc  右鍵 –鏈接 類里填入:ActionScript.loadPic_mc
注: loadPic_mc里只含一個元件motionLoad_mc

接下來編寫類rejigger_mc.as

package ActionScript{
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.*;

    import flash.display.SimpleButton;
    import flash.display.Sprite;
    import fl.transitions.Tween;
    import fl.transitions.easing.Back;
    import ActionScript.loadPic_mc;

    public class rejigger_mc extends Sprite {
        private var sprite:Sprite;
        private var portraitXml:XML;
        private var loadXml:URLLoader;
        private var dispatcher:IEventDispatcher;
        private var i:uint;
        private var len:uint;
        private var m:uint;
        //這些屬性都是私有的從此類外部是無法訪問的


        public function rejigger_mc():void {
            var request:URLRequest=new URLRequest("portrait.xml");
            loadXml=new URLLoader(request);
            //載入外部XML文件
            loadXml.addEventListener(Event.COMPLETE,comH);

        }

        private function comH(event:Event) {
            portraitXml=new XML(event.target.data);
            sprite=new Sprite();
            //這個其實就是裝loadPic_mc的容器
            sprite.x=10;
            sprite.y=10;
            this.addChild(sprite);
            var maskSprite:Sprite=new Sprite();
            //只是為了遮蓋 所以不必添加到顯示列表中
            maskSprite.graphics.beginFill(0xffffff);
            maskSprite.graphics.drawRect(10,10,150,80);
            maskSprite.graphics.endFill();
            sprite.mask=maskSprite;

            this.right_btn.addEventListener(MouseEvent.CLICK,moveRight);
            this.left_btn.addEventListener(MouseEvent.CLICK,moveLeft);
            //又該訂閱事件了
            i=0;
            len=0;
            for (var item:String in portraitXml.part) {
                len++;
                //不知道怎么取得XML子節點的長度,要是轉換為XML文檔類的話覺得很麻煩
            }
            loadPor();

            loadXml.removeEventListener(Event.COMPLETE,comH);
            //卸載監聽
        }
        private function loadPor():void {
            if (i<len) {
                var loadPic:loadPic_mc=new loadPic_mc(portraitXml.part{i}[email protected]);//基于發布系統的問題,此處的大括號需要換為中括號.
                loadPic.fun=loadPor;
                sprite.addChild(loadPic);
                //在sprite里添加顯示對象loadPic
                loadPic.x=i*150;

                i++;
            } else {
                return;
            }
        }
        private function moveRight(event:MouseEvent) {
            if (m>0) {
                m--;
                var aTween:Tween = new Tween( sprite, "x", Back.easeOut, sprite.x, 10-m*150, 1, true);
                //移動是直接移動sprite,因為sprite里含N多個loadPic
            } else {
                return;
            }
        }
        private function moveLeft(event:MouseEvent) {
            if (m<len-1) {
                m++;
                var aTween:Tween = new Tween( sprite, "x", Back.easeOut, sprite.x, 10-m*150, 1, true);
            } else {
                return;
            }
        }
    }
} 

在庫里找到rejigger_mc  右鍵 –鏈接 類里填入:ActionScript. rejigger_mc
基類可以寫成flash.display.Sprite  因為這個類擴展的是Sprite類
注:rejigger_mc里只含兩個元件   都是按鈕

最后一步,是在主時間上寫上代碼如下:

this.stage.frameRate=31;
this.stage.scaleMode=StageScaleMode.NO_SCALE;
this.stage.align=StageAlign.TOP_LEFT;


import ActionScript.rejigger_mc;
var myrejigger:rejigger_mc=new rejigger_mc();
addChild(myrejigger); 

導出去測試好了:)

還不錯吧,對比下XML+MovieClipLoader類就知道了,編寫3.0首先代碼布局上有很層次感,容易閱讀,我想這點主要歸功于處理事件機制 了,顯示對象不在像以前那樣混亂,現在更有層次感。其次處理XML比以前要便捷,最后呢,最重要的一點就是編完之后有種酷酷的感覺,代碼和界面的分 離。。。。。

可能剛開始有很多的不習慣盡管事實上沒有2.0方便吧,但做的東西多了相信你一定會體會更多的優越性,足夠彌補它的不便。

參考資料:
//www.vyjto.com/tutorial/show.php?id=44
當初還是看了這篇教程著手3.0的,更多的幻想來源于此

 

源文件下載

討論教程

關于我們

萬博思圖(北京)信息技術有限公司,專業的flash,flex開發團隊,5年經驗。公司致力于互聯網上的業務的開展,對于互動網站行銷,互聯網應用程序開發有成熟的解決方案。我們關注互聯網市場動態,關注新技術,更注重在新的領域不斷探索發現。
萬博思圖業務內容主要包括企業品牌Flash網站開發,企業形象宣傳Flash設計,動畫,多媒體演示,Flex企業級應用程序開發,擁有眾多成功案例,歡迎來電咨詢。
COPYRIGHT BY WEBSTUDIO INTERACTIVE DESIGN Co.,Ltd. ALL RIGHTS RESERVED.
公司地址: 北京市朝陽區朝外SOHO D 座727室 郵編: 100026 EMAIL: [email protected]
電話: 010-59070059 / 010-86390986-802  手機: 13693660520 傳真: 010-59070059-801
京公網安備:110108006741      京ICP備:05013074號-1
王先生