flex swf和movieclip之前的微妙关系

开始不清楚, 一直尝试想load图片一样加载一个swftools转换的swf,然后在尝试转换成movieclip的时候,总是报错, avmiMovieClip 不能转换成movieclip之类的。

但为什么有的swf可以轻松转换成movieclip呢?

 

后面我明白这两种movieclip根本就是不同存储格式了,—— 虽然都是swf后缀

 

关于movieclip ,我一直不太明白,其实它相当的有用。 

 

package
{
import flash.display.Loader;
import flash.errors.EOFError;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLRequest;
import flash.net.URLStream;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
import flash.utils.ByteArray;
import flash.utils.Endian;

import mx.controls.Alert;


public class ForcibleLoader
{
    public function ForcibleLoader()//loader:Loader
    {
        this.loader = new Loader();
        
        _stream = new URLStream();
        _stream.addEventListener(Event.COMPLETE, completeHandler);
        _stream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        _stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
    }
    
    private var _loader:Loader;
    private var _stream:URLStream;
    private var _callback:Function;
    
    public function get loader():Loader
    {
        return _loader;
    }
    
    public function set loader(value:Loader):void
    {
        _loader = value;
    }
    
    public function load(url:String, callback:Function):void
    {
        var request:URLRequest = new URLRequest(url);
        this._callback = callback;
        _stream.load(request);
        
//        var urlRequest:URLRequest = new URLRequest("adobe1231.swf");
//        var urlLoader:URLLoader=new URLLoader();
//        urlLoader.addEventListener(Event.COMPLETE,completeHandler);
//        urlLoader.dataFormat=URLLoaderDataFormat.BINARY;
        

    }
        
    private function completeHandler(event:Event):void
    {
        var inputBytes:ByteArray = new ByteArray();
        _stream.readBytes(inputBytes);
//        _stream.close();
        inputBytes.endian = Endian.LITTLE_ENDIAN;
        
        if (isCompressed(inputBytes)) {
            uncompress(inputBytes);
        }
        
        var version:uint = uint(inputBytes[3]);
        
//        if (version < 9) {
//            updateVersion(inputBytes, 9);
//        }
//        if (version > 7) {
//            flagSWF9Bit(inputBytes);
//        }
//        else {
//            insertFileAttributesTag(inputBytes);
//        }
        
        if (version <= 9) {
            if (version == 8 || version == 9)
            {
                flagSWF9Bit(inputBytes);
            }else if (version <= 7)
            {
                insertFileAttributesTag(inputBytes);
            }
            updateVersion(9, inputBytes);
        }
        
        this.loader = new Loader();
        loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress)
        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError)
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete)
        
        
                var context:LoaderContext = new LoaderContext();
                context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
                
        loader.loadBytes(inputBytes, context);//new LoaderContext(true, ApplicationDomain.currentDomain));
        //loader.addEventListener(Event.COMPLETE, loaderComplete)
    }
    
    private function loadComplete(evt:Event):void
    {
        Alert.show("sssssssssssss");
        //_callback(loader.content as MovieClip);
    }
    private function loadProgress(evt:ProgressEvent):void
    {
        trace("  ProgressEvent  : " +evt.bytesLoaded + "  / " +evt.bytesTotal);
        if(evt.bytesLoaded == evt.bytesTotal) {
            
            //_callback(loader.content as MovieClip);
        }
    }
    private function onError(evt:IOErrorEvent):void
    {
        Alert.show("  ProgressEvent  ");
    }
    
    
    private function isCompressed(bytes:ByteArray):Boolean
    {
        return bytes[0] == 0x43;
    }
    
    private function uncompress(bytes:ByteArray):void
    {
        var cBytes:ByteArray = new ByteArray();
        cBytes.writeBytes(bytes, 8);
        bytes.length = 8;
        bytes.position = 8;
        cBytes.uncompress();
        bytes.writeBytes(cBytes);
        bytes[0] = 0x46;
        cBytes.length = 0;
    }
    
//    private function getBodyPosition(bytes:ByteArray):uint
//    {
//        var result:uint = 0;
//        
//        result += 3; // FWS/CWS
//        result += 1; // version(byte)
//        result += 4; // length(32bit-uint)
//        
//        var rectNBits:uint = bytes[result] >>> 3;
//        result += (5 + rectNBits * 4) / 8; // stage(rect)
//        
//        result += 2;
//        
//        result += 1; // frameRate(byte)
//        result += 2; // totalFrames(16bit-uint)
//        
//        return result;
//    }
    
        public function flagSWF9Bit(bytes:ByteArray):void
        {
            var pos:int = findFileAttributesPosition(getBodyPosition(bytes), bytes);
            
            if (pos != -1) {
                bytes[pos + 2] |= 0x08;
            }
            else {
                insertFileAttributesTag(bytes);
            }
        }
        
        private function findFileAttributesPosition(offset:uint, bytes:ByteArray):int
        {
            bytes.position = offset;
            
            try {
                for (;;) {
                    var byte:uint = bytes.readShort();
                    var tag:uint = byte >>> 6;
                    if (tag == 69) {
                        return bytes.position - 2;
                    }
                    var length:uint = byte & 0x3f;
                    if (length == 0x3f) {
                        length = bytes.readInt();
                    }
                    bytes.position += length;
                }
            }
            catch (e:EOFError) {
            }
            
            return -1;
        }
        private function insertFileAttributesTag(bytes:ByteArray):void
        {
            var pos:uint = getBodyPosition(bytes);
            var afterBytes:ByteArray = new ByteArray();
            afterBytes.writeBytes(bytes, pos);
            bytes.length = pos;
            bytes.position = pos;
            bytes.writeByte(0x44);
            bytes.writeByte(0x11);
            bytes.writeByte(0x08);
            bytes.writeByte(0x00);
            bytes.writeByte(0x00);
            bytes.writeByte(0x00);
            bytes.writeBytes(afterBytes);
            afterBytes.length = 0;
        }
        private function getBodyPosition(bytes:ByteArray):uint
        {
            var result:uint = 0;
            
            result += 3; // FWS/CWS
            result += 1; // version(byte)
            result += 4; // length(32bit-uint)
            
            var rectNBits:uint = bytes[result] >>> 3;
            result += (5 + rectNBits * 4) / 8; // stage(rect)
            
            result += 2;
            
            result += 1; // frameRate(byte)
            result += 2; // totalFrames(16bit-uint)
            
            return result;
        }
        
        public function updateVersion(version:uint, b:ByteArray):void
        {
            b[3] = version;
        }
    
//    private function findFileAttributesPosition(offset:uint, bytes:ByteArray):uint
//    {
//        bytes.position = offset;
//        
//        try {
//            for (;;) {
//            var byte:uint = bytes.readShort();
//            var tag:uint = byte >>> 6;
//            if (tag == 69) {
//            return bytes.position - 2;
//            }
//            var length:uint = byte & 0x3f;
//            if (length == 0x3f) {
//            length = bytes.readInt();
//            }
//            bytes.position += length;
//            }
//        }
//        catch (e:EOFError) {
//        }
//        
//        return NaN;
//    }
    
//    private function flagSWF9Bit(bytes:ByteArray):void
//    {
//        var pos:uint = findFileAttributesPosition(getBodyPosition(bytes), bytes);
//        if (!isNaN(pos)) {
//            bytes[pos + 2] |= 0x08;
//        }
//    }
//    
//    private function insertFileAttributesTag(bytes:ByteArray):void
//    {
//        var pos:uint = getBodyPosition(bytes);
//        var afterBytes:ByteArray = new ByteArray();
//        afterBytes.writeBytes(bytes, pos);
//        bytes.length = pos;
//        bytes.position = pos;
//        bytes.writeByte(0x44);
//        bytes.writeByte(0x11);
//        bytes.writeByte(0x08);
//        bytes.writeByte(0x00);
//        bytes.writeByte(0x00);
//        bytes.writeByte(0x00);
//        bytes.writeBytes(afterBytes);
//        afterBytes.length = 0;
//    }
//    
//    private function updateVersion(bytes:ByteArray, version:uint):void
//    {
//        bytes[3] = version;
//    }
    
    private function ioErrorHandler(event:IOErrorEvent):void
    {
        loader.contentLoaderInfo.dispatchEvent(event.clone());
    }
    
    private function securityErrorHandler(event:SecurityErrorEvent):void
    {
        loader.contentLoaderInfo.dispatchEvent(event.clone());
    }
}
}
View Code

 

 

 

无论如何, 下面的loadComplete就是没有执行,像是某个地方卡住了一样,但是、、、 我看了progess都是100%的。。 试过很多方式,还是一样结果。

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete)

但为什么其他方式就行了呢? 几乎是一样的写法啊?

package
{
    import com.hurlant.crypto.Crypto;
    import com.hurlant.crypto.symmetric.ICipher;
    import com.hurlant.crypto.symmetric.IPad;
    import com.hurlant.crypto.symmetric.PKCS5;
    import com.hurlant.util.Hex;
    
    import flash.display.DisplayObject;
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.errors.*;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.net.*;
    import flash.system.LoaderContext;
    import flash.utils.ByteArray;
    import flash.utils.Endian;
    
    import mx.controls.Alert;
    import mx.controls.ProgressBar;
    /**
     *队列加载类                  
     * @author Ryan_Leung
     * 
     */     
    public class LoaderManager
    {
//        public var _order:int = 0;
        public var _loadOrder:int = 0;
        public var loadOrder_from:int = 0;
        public var loadOrder_to:int = 0;
        private var _callBack:Function;
        public var _paths:Array = [];
        private var _load:Loader;
        private var _progressBar:ProgressBar;
        private var _fristloadswfs:int;
        
        
        private var loadedSWFs:Array = [];
        
        private var noloadSWFs:Array = [];
        
        
        public var mc:MovieClip = null;
        
        public var bookdecrypt:String = "00000000";
        private var stream:URLStream = null;
        
        public function LoaderManager(progressBar:ProgressBar, fristloadswfs:int)
        {
            _loadOrder = 0;
            loadOrder_from = 0;
            loadOrder_to = fristloadswfs;
            _progressBar = progressBar;
            _fristloadswfs = fristloadswfs;
        }
        public function addPath(path:String):void
        {
            for(var i:int = 0 ; i < _paths.length ; i++)
            {
                if(_paths.indexOf(path) > -1)
                    return;
            }
            _paths.push(path);
        }
        public function getPath(pageNum:int):String 
        {
            if(pageNum > _paths.length)
            {
                return "";
            }
            var ss:String =  _paths[pageNum]  ;
            return ss;
            //_load.load(new URLRequest(loadedSWFs[_loadOrder]) , new LoaderContext(true));
        }
         
        /**
         *  通过paths数组的索引找到路径path加载swf
         *  加载某一个swf时候,需要同时确保其前后6个swf都已经加载上, 否则有问题。
         * 
         */        
        public function loadSwfById(fromOrder:int,toOrder:int, callBack:Function):void {
            _loadOrder = fromOrder;
            loadOrder_from = fromOrder;
            loadOrder_to = toOrder; 
            start(callBack);// // call back when the load is finished! 调用了两次, 不知道合理不合理
        }
        
        /**
         * 在所有资源路径添加完之后、开始加载
         */        
        public function start(callBack:Function):void 
        {    
            
//            stream = new URLStream();
//            stream.addEventListener(Event.COMPLETE,completeHandler_s);
//            stream.addEventListener(ProgressEvent.PROGRESS,progressHandler);
//            stream.addEventListener(IOErrorEvent.IO_ERROR,ioerrorHandler);
            if(stream != null)
            {
                stream.close();
                stream = null;
            }
            if(this.pbuf != null)
            {
                this.pbuf.clear();
                
            }
            _load = new Loader();
            if(this.loader != null)
            {
                try {
                    this.loader.close();
                } catch (err:Error) {
                    trace(err.message);
                }
                this.loader = null;
                
            }
            
            _callBack = callBack;
            loading();
        }
        
        private var urlReq:URLRequest = null;
        public var buffer:ByteArray = null;
        private var isencrty:Boolean = false;
        private var pbuf:ByteArray = new ByteArray();
        private var loaderCtx:LoaderContext = null;
        public var loader:Loader = null;
        private function progressHandler(event:ProgressEvent):void
        {
            //trace("progress ……");
            this.stream.readBytes(this.pbuf,this.pbuf.length);
            
        }
        public function isCompressed(bytes:ByteArray):Boolean
        {
            return bytes[0] == 0x43;
        }
        private function ioerrorHandler(event:IOErrorEvent):void
        {
            trace("ioerror");
            trace(event.text);
        }
        private function uncompress(bytes:ByteArray):void
        {
            var cBytes:ByteArray = new ByteArray();
            cBytes.writeBytes(bytes, 8);
            bytes.length = 8;
            bytes.position = 8;
            cBytes.uncompress();
            bytes.writeBytes(cBytes);
            bytes[0] = 0x46;
            cBytes.length = 0;
        }
        private function completeHandler_s(event:Event):void
        {
            trace("Stream complete");
            //解密            
            
            bookdecrypt ="s3@74$*K";
            var decryptLen:int = this.pbuf.readInt();
            var decryptStr:String = this.pbuf.readUTFBytes(decryptLen);
            //trace(decryptLen,decryptStr);
            var kdata:ByteArray = Hex.toArray(Hex.fromString(bookdecrypt));
            var data:ByteArray = Hex.toArray(decryptStr);
            var name:String = "simple-des-ecb";
            var pad:IPad = new PKCS5;
            var mode:ICipher = Crypto.getCipher(name,kdata,pad);
            pad.setBlockSize(mode.getBlockSize());
            mode.decrypt(data);
            
            if(data==null)
            {
                onLoadComplete(event);
                return;
            }
            this.buffer.endian = Endian.LITTLE_ENDIAN;
            this.buffer.writeBytes(data);
            //trace(Hex.fromArray(data));
            this.pbuf.readBytes(this.buffer,this.buffer.length);
            //            
            
            
            //              this.buffer = this.pbuf;
            
            if(isCompressed(this.buffer)) {
                //trace("uncompress");
                uncompress(this.buffer);
            }    
            var version:uint = uint(this.buffer[3]);
            //trace(version,"ver");
            if (version <= 9) {
                if (version == 8 || version == 9)
                {
                    flagSWF9Bit(this.buffer);
                }else if (version <= 7)
                {
                    insertFileAttributesTag(this.buffer);
                }
                updateVersion(9,this.buffer);
            }
            //var result:DisplayObject = loader.content as DisplayObject;
            //ResourceBox.setResource(_paths[_loadOrder] , result);
            if(_loadOrder ==0)
            {
                //_loadOrder =_loadOrder+1;
                
            }
            //loading(); 
            //_loadOrder++;
            
            this.loader = new Loader();
            this.loader.contentLoaderInfo.addEventListener(Event.COMPLETE,swfCompleteHandler);
            this.loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,swfProgress);
            this.loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR , onError);
            this.loader.loadBytes(this.buffer,this.loaderCtx);
            //this.loader.loadBytes(this.buffer);
            
        
            trace("正加载文件:"+_loadOrder);
                
             
            loadedSWFs.push(this.loader);
            
        }
        private function onLoadComplete(event:Event):void
        {
            if (stream.connected)
            {
                var b:int;
                try {
                    do {
                        b = stream.readByte();
                        pbuf.writeByte(b);
                    } while (true);
                } catch (e:EOFError) {
                    //Alert.show(bytes.length.toString());
                }
            }
            this.buffer.writeBytes(buffer);
            this.loader.loadBytes(buffer);
        }
        private function swfProgress(event:ProgressEvent):void
        {
            //trace("swf progress");
            //trace("正加载文件:"+_loadOrder);
            if(mc != null)
            {
                //trace(mc.framesLoaded,mc.totalFrames);
            }
        }
        private function swfCompleteHandler(event:Event):void
        {
            trace("swf complete");
            
            //event.target.removeEventListener(Event.COMPLETE, this.swfCompleteHandler);
            this.mc =  event.target.content as MovieClip;
            //this.loader.loadBytes(this.buffer,this.loaderCtx);
            //var result:DisplayObject = loader.content as DisplayObject;
            //ResourceBox.setResource(_paths[_loadOrder] , result);
            
//            if(_loadOrder == 0 || _progressBar.visible == true)    // ?? 
//            {
//                _progressBar.visible = false;
                _callBack(mc);
//            }
            _loadOrder=_loadOrder+1;
            
//             _loadOrder =_loadOrder+1;  ??
            trace("已加载文件:"+_loadOrder);
            //loading();
            /*test  */
            //this.mc.trackAsMenu=true;
            //flash.utils.setTimeout(tt,1000);
            
        }
        
        public function flagSWF9Bit(bytes:ByteArray):void
        {
            var pos:int = findFileAttributesPosition(getBodyPosition(bytes), bytes);
            
            if (pos != -1) {
                bytes[pos + 2] |= 0x08;
            }
            else {
                insertFileAttributesTag(bytes);
            }
        }
        private function findFileAttributesPosition(offset:uint, bytes:ByteArray):int
        {
            bytes.position = offset;
            
            try {
                for (;;) {
                    var byte:uint = bytes.readShort();
                    var tag:uint = byte >>> 6;
                    if (tag == 69) {
                        return bytes.position - 2;
                    }
                    var length:uint = byte & 0x3f;
                    if (length == 0x3f) {
                        length = bytes.readInt();
                    }
                    bytes.position += length;
                }
            }
            catch (e:EOFError) {
            }
            
            return -1;
        }
        private function insertFileAttributesTag(bytes:ByteArray):void
        {
            var pos:uint = getBodyPosition(bytes);
            var afterBytes:ByteArray = new ByteArray();
            afterBytes.writeBytes(bytes, pos);
            bytes.length = pos;
            bytes.position = pos;
            bytes.writeByte(0x44);
            bytes.writeByte(0x11);
            bytes.writeByte(0x08);
            bytes.writeByte(0x00);
            bytes.writeByte(0x00);
            bytes.writeByte(0x00);
            bytes.writeBytes(afterBytes);
            afterBytes.length = 0;
        }
        private function getBodyPosition(bytes:ByteArray):uint
        {
            var result:uint = 0;
            
            result += 3; // FWS/CWS
            result += 1; // version(byte)
            result += 4; // length(32bit-uint)
            
            var rectNBits:uint = bytes[result] >>> 3;
            result += (5 + rectNBits * 4) / 8; // stage(rect)
            
            result += 2;
            
            result += 1; // frameRate(byte)
            result += 2; // totalFrames(16bit-uint)
            
            return result;
        }
        
        public function updateVersion(version:uint, b:ByteArray):void
        {
            b[3] = version;
        }
        
        
        private function loading():void 
        {
            if(_loadOrder < loadOrder_from || _loadOrder > loadOrder_to ||    // 加载文件数现定于  loadOrder_from、loadOrder_to之间
                _loadOrder > _paths.length - 1  )
            {
                
                _progressBar.visible = false;
                
                _callBack(true);// ??
                return;
            }else
            {
                
            }
        
            //            _load.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS , onProgress);
            //            _load.contentLoaderInfo.addEventListener(Event.COMPLETE , completeHandler);
            //            _load.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR , onError);
            //            
            
            if(this.buffer != null)
            {
                this.buffer.clear();
            }
            else
            {
                this.buffer = new ByteArray();
            }
            if(this.stream!=null)
            {
                this.stream.close();
            }
            
            this.stream = new URLStream();
            this.stream.addEventListener(Event.COMPLETE,completeHandler_s);
            this.stream.addEventListener(ProgressEvent.PROGRESS,progressHandler);
            this.stream.addEventListener(IOErrorEvent.IO_ERROR,ioerrorHandler);
            
            this.urlReq = new URLRequest(_paths[_loadOrder]);
            trace(_paths[_loadOrder]);
            this.stream.load(this.urlReq);
        //    _load.load(new URLRequest(_paths[_loadOrder]) , new LoaderContext(true));
        }
        private function onError(evt:IOErrorEvent):void
        {
            Alert.show(evt.toString() , "加载出错");
        }
        private function onProgress(evt:ProgressEvent):void
        {
            //trace("LoaderManager加载进度" + evt.bytesLoaded / evt.bytesTotal);
            _progressBar.label = "加载中......";
            _progressBar.setProgress(evt.bytesLoaded , evt.bytesTotal);
        }
//        private function completeHandler(evt:Event):void 
//        {
//            var result:DisplayObject = _load.content as DisplayObject;
//            ResourceBox.setResource(_paths[_loadOrder] , result);
//            if(_loadOrder >= _paths.length - 1)
//            {
//                return;
//            }
//            if(_loadOrder == 0 || _progressBar.visible == true)
//            {
//                _progressBar.visible = false;
//                _callBack();
//            }
//         
//             
//        }
         
    }    
}
View Code

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值