ActionScript 3.0实例——Loading

ActionScript 3.0做Loader似乎有点麻烦,但肯定比ActionScript 2.0更强大。下面这个实例在用百分比显示进度的基础上,使用BitmapData类结合Timer类实现图片像素溶解出场,并为图片添加dropShadow和Bevel滤镜。当图片像素溶解到一半的时候,将移除下载状态的提示信息文本。代码如下:

package com.riafan.tutorials { 
    import flash.text.*; 
    import flash.display.*; 
    import flash.events.*; 
    import flash.filters.*; 
    import flash.net.URLRequest; 
    import flash.utils.Timer; 
    import flash.geom.*; 
    public class LoadingDemo extends MovieClip { 
        private var bitmapData:BitmapData=new BitmapData(600,450,true,0xFFFFFFFF); 
        private var sourceBitmapData:BitmapData=new BitmapData(600,450,true,0xFFFFFFFF); 
        private var loader:Loader=new Loader(); 
        private var tf:TextField; 
        private var rec:Rectangle=sourceBitmapData.rect; 
        private var randomSeed:uint=0; 
        private var times:uint=30; 
        private var numberOfPixels:uint=(rec.width*rec.height)/times; 
        public function LoadingDemo() { 
            //滤镜应用 
            var dropShadowFilter:DropShadowFilter=new DropShadowFilter(); 
            var bevelFilter:BevelFilter=new BevelFilter(); 
            loader.filters=[dropShadowFilter,bevelFilter]; 
            //指定bitmap images 
            var bitmap:Bitmap=new Bitmap(bitmapData); 
            addChild(bitmap); 
            //添加TextField 
            tf=new TextField(); 
            addChild(tf); 
            //初始化TextField 
            tf.text="开始下载"; 
            tf.selectable=false; 
            tf.autoSize = TextFieldAutoSize.CENTER; 
            tf.background=true; 
            tf.backgroundColor=0xFFFFCC; 
            tf.textColor=0x000000; 
            tf.x=(550-tf.width)/2; 
            tf.y=(400-tf.height)/2; 
            //下载图片 
            var req:URLRequest=new URLRequest(); 
            req.url="flower.jpg"; 
            loader.load(req); 
            //为LoaderInfo对象注册侦听器 
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete); 
            loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress); 
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onError); 
        } 
        //正在下载时执行 
        private function onProgress(e:Event):void { 
            var info:LoaderInfo=e.target as LoaderInfo; 
            var percent:int=((info.bytesLoaded)/(info.bytesTotal))*100; 
            tf.text="已经下载"+percent.toString() + "%"; 
            tf.textColor=0x009900; 
        } 
        //下载完毕后执行 
        private function onComplete(e:Event):void { 
            var matrix:Matrix=new Matrix(.5,0,0,.5,19,8); 
            sourceBitmapData.draw(loader,matrix); 
            //stage应用 
            loader.x=(stage.stageWidth-loader.width)/2; 
            loader.y=(stage.stageHeight-loader.height)/2; 
            tf.text="下载完毕"; 
            tf.textColor=0x000000; 
            //timer应用 
            var timer:Timer=new Timer(60,times);            //注册time侦听器 
            timer.addEventListener(TimerEvent.TIMER,onTimer); 
            timer.start(); 
        } 
        //下载出错时执行 
        private function onError(err:IOErrorEvent):void { 
            tf.text=err.text; 
            tf.textColor=0x990000; 
        } 
        //当Timer对象达到指定的延迟间隔时执行 
        private function onTimer(e:TimerEvent):void { 
            //像素溶解特效 
            randomSeed=bitmapData.pixelDissolve(sourceBitmapData,rec,new Point(0,0),randomSeed,numberOfPixels); 
            //当图片像素溶解到一半的时候,移除下载状态的提示信息文本 
            if (e.target.currentCount==times/2) { 
                removeChild(tf); 
            } 
        } 
    } 
}

点击此处查看效果。

说明:

  • ActionScript 3.0中的Loader类与ActionScript 2.0的MovieClipLoader类相似。注意:注册侦听器时是为LoaderInfo对象注册而非Loader实例本身。
  • 在ActionScript 3.0中Timer类已经取代了setInterval命令,它不但可以设置延迟的时间、执行的次数,还可以控制定时器的开始、停止和重置。

发表评论