·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]ProgressiveLoader 渐进式加载图像

时间:2015-07-08 18:31酷播
[AS3]ProgressiveLoader 渐进式加载图像

渐进式加载类,用法跟Loader差不多.

不同点:

  1. 当加载流错误时只能获取到 "Error #2124: 加载的文件为未知类型。"
  2. 侦听contentLoaderInfo的Progress事件的bytesLoaded,bytesTotal是整个文件的已加载字节和总字节.
  3. contentLoaderInfo.bytesLoaded, contentLoaderInfo.bytesTotal指当前loader里的字节数和总字节.
    1. 代码  
    2.  
    3. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package cn.lite3.net  
    4. { 
    5.     import flash.display.LoaderInfo; 
    6.     import flash.errors.IOError; 
    7.     import flash.events.Event; 
    8.     import flash.events.IOErrorEvent; 
    9.     import flash.events.ProgressEvent; 
    10.     import flash.events.SecurityErrorEvent; 
    11.     import flash.system.LoaderContext; 
    12.     import flash.display.Loader; 
    13.     import flash.net.URLRequest; 
    14.     import flash.net.URLStream; 
    15.     import flash.utils.ByteArray; 
    16.   
    17.     /** 
    18.      * 渐进式加载类 
    19.      * 用法跟Loader一样, 
    20.      * <p><b>不同点:</b></p> 
    21.      * 1.当加载流错误时只能获取到 "Error #2124: 加载的文件为未知类型。" <br/> 
    22.      * 2.侦听contentLoaderInfo的Progress事件的bytesLoaded,bytesTotal是整个文件的已加载字节和总字节.<br/> 
    23.      * 3.contentLoaderInfo.bytesLoaded, contentLoaderInfo.bytesTotal指当前loader里的字节数和总字节 
    24.      *  
    25.      * @author lite3 
    26.      */ 
    27.     public class ProgressiveLoader extends Loader 
    28.     { 
    29.         private var bytesLoaded:uint = 0;            // 已加载的字节数 
    30.         private var bytesToal:uint = 0;             // 总字节数 
    31.   
    32.         private var dataChange:Boolean = false;        // buffer的数据是否改变     
    33.         private var streamComplete:Boolean = false;    // 文件是否加载完成 
    34.   
    35.         private var context:LoaderContext;            //  
    36.   
    37.         private var buffer:ByteArray;                // 数据缓存 
    38.         private var stream:URLStream;                // 流 
    39.   
    40.         /** 
    41.          * 关闭流,并清理所有侦听器 
    42.          */ 
    43.         override public function close():void  
    44.         { 
    45.             // 清除流相关 
    46.             if (stream) 
    47.             { 
    48.                 if (stream.connected) stream.close(); 
    49.                 streamRemoveEvent(stream); 
    50.             } 
    51.             // 清除conentLoaderInfo相关的事件 
    52.             if (contentLoaderInfo.hasEventListener(Event.COMPLETE)) 
    53.             { 
    54.                 loaderInfoRemoveEvent(super.contentLoaderInfo); 
    55.             } 
    56.             // 清除显示数据事件 
    57.             if (hasEventListener(Event.ENTER_FRAME)) 
    58.             { 
    59.                 removeEventListener(Event.ENTER_FRAME, showData); 
    60.             } 
    61.             buffer = null; 
    62.         } 
    63.         /** 
    64.          * 加载字节数据,不会在内部触发contentLoaderInfo相关事件 
    65.          * @param    bytes 
    66.          * @param    context 
    67.          */ 
    68.         override public function loadBytes(bytes:ByteArray, context:LoaderContext = null):void 
    69.         { 
    70.             close(); 
    71.             super.unload(); 
    72.             super.loadBytes(bytes, context); 
    73.         } 
    74.   
    75.         /** 
    76.          * 加载一个url文件,并渐进显示(如果是渐进格式) 
    77.          * @param    request 
    78.          * @param    context 
    79.          */ 
    80.         override public function load(request:URLRequest, context:LoaderContext = null):void  
    81.         { 
    82.             streamComplete = false; 
    83.             if (!stream) stream = new URLStream(); 
    84.             if (stream.connected) stream.close(); 
    85.             this.context = context; 
    86.             dataChange = false; 
    87.   
    88.             buffer = new ByteArray(); 
    89.             super.unload(); 
    90.             addEventListener(Event.ENTER_FRAME, showData); 
    91.             loaderInfoAddEvent(super.contentLoaderInfo); 
    92.             streamAddEvent(stream); 
    93.             stream.load(request); 
    94.         } 
    95.   
    96.         // 将缓存中的数据显示为图像 
    97.         private function showData(e:Event = null):void  
    98.         { 
    99.             if (!dataChange || !stream.connected) return; 
    100.   
    101.             dataChange = false; 
    102.             if (stream.bytesAvailable > 0) 
    103.             { 
    104.                 stream.readBytes(buffer, buffer.length, stream.bytesAvailable); 
    105.             } 
    106.             if (buffer.length > 0) 
    107.             { 
    108.                 super.unload(); 
    109.                 super.loadBytes(buffer, context); 
    110.             } 
    111.   
    112.             // 加载完成 
    113.             if (streamComplete) 
    114.             { 
    115.                 close(); 
    116.                 streamComplete  = false; 
    117.             } 
    118.         } 
    119.         // 修正contentLoaderInfo的ProgressEvent.PROGRESS事件的进度值 
    120.         private function loaderProgressHandler(e:ProgressEvent):void  
    121.         { 
    122.             e.bytesLoaded = bytesLoaded; 
    123.             e.bytesTotal = bytesToal; 
    124.         } 
    125.   
    126.         // 显示完成 
    127.         private function loaderCompleteHandler(e:Event):void  
    128.         { 
    129.             if (streamComplete) 
    130.             { 
    131.                 streamComplete = false; 
    132.                 loaderInfoRemoveEvent(super.contentLoaderInfo); 
    133.             }else 
    134.             { 
    135.                 e.stopImmediatePropagation(); 
    136.             } 
    137.         } 
    138.   
    139.         // 数据加载完成 
    140.         private function streamCompleteHandler(e:Event):void  
    141.         { 
    142.             streamRemoveEvent(stream); 
    143.             // 这里不删除EnterFrame事件,最后一段总是不会显示, 
    144.             // 并且complete事件里showData也不行, 
    145.             // 所以最后延时显示一次, 
    146.             streamComplete = true; 
    147.             dataChange = true; 
    148.         } 
    149.         // 数据加载中,保存数据加载的值 
    150.         private function streamProgressHandler(e:ProgressEvent):void  
    151.         { 
    152.             bytesLoaded = e.bytesLoaded; 
    153.             bytesToal = e.bytesTotal; 
    154.             dataChange = true; 
    155.         } 
    156.         // 数据流错误, 但是也会加载400K左右的数据, 
    157.         // 然后由contentLoaderInfo抛出IOError或者IOErrorEvent 
    158.         // 但不会是流错误,而是未知文件类型 
    159.         private function streamErrorHandler(e:IOError):void  
    160.         { 
    161.             close(); 
    162.         } 
    163.   
    164.         private function streamAddEvent(stream:URLStream):void 
    165.         { 
    166.             stream.addEventListener(Event.COMPLETE, streamCompleteHandler); 
    167.             stream.addEventListener(ProgressEvent.PROGRESS, streamProgressHandler); 
    168.             stream.addEventListener(IOErrorEvent.IO_ERROR, streamErrorHandler); 
    169.         } 
    170.   
    171.         private function streamRemoveEvent(stream:URLStream):void 
    172.         { 
    173.             stream.removeEventListener(Event.COMPLETE, streamCompleteHandler); 
    174.             stream.removeEventListener(ProgressEvent.PROGRESS, streamProgressHandler); 
    175.             stream.removeEventListener(IOErrorEvent.IO_ERROR, streamErrorHandler); 
    176.         } 
    177.   
    178.         private function loaderInfoAddEvent(loaderInfo:LoaderInfo):void 
    179.         { 
    180.             loaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler, false, int.MAX_VALUE); 
    181.             loaderInfo.addEventListener(ProgressEvent.PROGRESS, loaderProgressHandler, false, int.MAX_VALUE); 
    182.         } 
    183.   
    184.         private function loaderInfoRemoveEvent(loaderInfo:LoaderInfo):void 
    185.         { 
    186.             loaderInfo.removeEventListener(Event.COMPLETE, loaderCompleteHandler); 
    187.             loaderInfo.removeEventListener(ProgressEvent.PROGRESS, loaderProgressHandler); 
    188.         } 
    189.     } 
    190. } 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器