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

热门文章推荐

请稍候...

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

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