Flex 预载界面美化

 

Flex 的默认的 Preloader, 平心而论,不是很好看。一个个性化的Preloader,基本上要包括三个部分

1. 公司或者网站Logo,或者个性化的预载图片。好似是桌面软件的Splash Screen。

2. 载入数据的进度,文字形式的百分比。

3. 载入进度条

preloader不像Flex项目中普通的部件可以通过CSS进行设置,是因为当程序初始载入时,CSS文件的设定还未被载入,所以不好通过CSS进行外观的控制

这里有Ted把SWF,GIF 和 PNG 文件作为 Preloader 的教程。不过这里没有上述元素三合一的例子。

把网上的资料总结一下,这里放个三合一的例子。最终效果预览,
Flex 预载界面美化_第1张图片
 

设置WEB程序的Preloader为自制的Preloader时,要修改主程序Application标签中的preloader属性,

Flex代码  
  1. <?xml version="1.0" encoding="utf-8"?>      
  2. <MX:APPLICATION xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" preloader="com.ibsol.view.Preloader">      
  3. <MX:SCRIPT>      
  4. ....</MX:SCRIPT></MX:APPLICATION>    

 

这里的com.ibsol.view.Preloader是自定义Preloader类的路径。

 

Preloader要扩展DownloadProgressBar类才能设置自己的Preloader

Flex代码  
  1. package com.ibsol.view   
  2. {   
  3.     import flash.display.Sprite;   
  4.     import flash.events.Event;   
  5.     import flash.events.ProgressEvent;   
  6.     import flash.events.TimerEvent;   
  7.     import flash.text.TextField;   
  8.     import flash.utils.Timer;   
  9.        
  10.     import mx.events.FlexEvent;   
  11.     import mx.preloaders.DownloadProgressBar;   
  12.            
  13.         /**   
  14.          * 自定义加载页面   
  15.          * */   
  16.     public class Preloader extends DownloadProgressBar   
  17.     {   
  18.             //显示进度文字   
  19.         private var progressText:TextField;   
  20.             //进度条   
  21.         private var img:WelcomeScreen;   
  22.             //logo页面   
  23.         private var logo:WelcomeLogo;   
  24.         private var _timer:Timer;   
  25.            
  26.             /**   
  27.              * 初始化方法   
  28.              * */          
  29.         public function Preloader()   
  30.         {   
  31.             super();   
  32.             //将logo添加到当前页面   
  33.             logo=new WelcomeLogo();   
  34.             this.addChild(logo);   
  35.             //将进度条添加到当前页面   
  36.             img=new WelcomeScreen();   
  37.             this.addChild(img);   
  38.             //加入进度条文字   
  39.             progressText=new TextField();   
  40.             progressText.x=40;   
  41.             progressText.y=90;   
  42.             this.addChild(progressText);   
  43.             //进度条计时器初始化,实现进度条的原理就是不停的刷新进度条图片   
  44.             //因为每次进度条的长度不同,所以就有进度条在走的效果   
  45.             _timer=new Timer(1);   
  46.             _timer.addEventListener(TimerEvent.TIMER,drawTimerHandler);   
  47.             _timer.start();   
  48.         }   
  49.         override public function set preloader(value:Sprite):void   
  50.         {   
  51.             value.addEventListener(ProgressEvent.PROGRESS,progHandler);   
  52.             value.addEventListener(FlexEvent.INIT_COMPLETE,initCompleteHandler);   
  53.                 //在这里设置预加载页面居中   
  54.                 //如果在初始化函数中设置,会有stageWidht和最终大小不一致的错误,而导致不能居中   
  55.                 x=(stageWidth/2)-(300/2);   
  56.                 y=(stageHeight/2)-(180/2);   
  57.         }   
  58.         private function progHandler(evt:ProgressEvent):void   
  59.         {   
  60.             //计算进度,并且设置文字进度和进度条的进度   
  61.             var prog:Number=evt.bytesLoaded/evt.bytesTotal*100;   
  62.             progressText.text="已下载"+String(int(prog))+"%";   
  63.             if(img)   
  64.             {   
  65.                 img.progress=prog;   
  66.             }   
  67.         }   
  68.         private function compHandler(evt:Event):void   
  69.         {}   
  70.         private function initCompleteHandler(evt:FlexEvent):void   
  71.         {   
  72.             //如果载入完毕,则停止刷新   
  73.             img.ready=true;   
  74.             _timer.stop();   
  75.             //这里是测试,下载完毕后,不马上跳到程序默认界面,而是停留10秒后再跳入   
  76.             var timer:Timer=new Timer(1000,1);   
  77.             timer.addEventListener(TimerEvent.TIMER,dispatchComplete);   
  78.             timer.start();   
  79.         }   
  80.         private function initProgHandler(evt:FlexEvent):void     
  81.         {}   
  82.         private function dispatchComplete(evt:TimerEvent):void   
  83.         {   
  84.             //一定要分发这个事件,来通知程序已完全下载,可以进入程序的默认界面   
  85.             this.dispatchEvent(new Event(Event.COMPLETE));   
  86.         }   
  87.            
  88.             //计时器监听事件   
  89.         private function drawTimerHandler(evt:TimerEvent):void   
  90.         {   
  91.         img.refresh();   
  92.         }   
  93.            
  94.     }   
  95. }  

 

图片logo层的实现方法:

Flex代码  
  1. package com.ibsol.view   
  2. {   
  3.     import flash.display.Loader;   
  4.     import flash.utils.ByteArray;   
  5.            
  6.         /**   
  7.          * 图片logo层   
  8.          * */   
  9.     public class WelcomeLogo extends Loader   
  10.     {   
  11.         [Embed(source="img/logo.png",mimeType="application/octet-stream")]   
  12.         public var WelcomeScreenGraphic:Class;   
  13.         /**   
  14.          * 初始化方法   
  15.          * */   
  16.         public function WelcomeLogo()   
  17.         {   
  18.             this.loadBytes(new WelcomeScreenGraphic() as ByteArray);   
  19.         }   
  20.   
  21.     }   
  22. }  

 

进度条和图片可以放在一层,但是考虑到个时钟周期,都要刷新进度条的图片。

 

毕竟LOGO不用每次都刷新,那么我们就分开放置了。进度条层的代码如下,

Flex代码  
  1. package com.ibsol.view   
  2. {   
  3.     import flash.display.BitmapData;   
  4.     import flash.display.Graphics;   
  5.     import flash.display.Loader;   
  6.     import flash.display.Sprite;   
  7.        
  8.     import mx.graphics.codec.PNGEncoder;   
  9.        
  10.     public class WelcomeScreen extends Loader   
  11.     {   
  12.         //辅助属性,帮助进度条定位   
  13.         private static var _LogoWidth:int=300;   
  14.         private static var _LogoHeight:int=180;   
  15.         private static var _LeftMargin:int=5;   
  16.         private static var _RightMargin:int=5;   
  17.         private static var _Topmargin:int=1;   
  18.         private static var _BottomMargin:int=1;   
  19.         private static var _Padding:int=-60;   
  20.            
  21.         //进度条的样式的设定,如边框颜色等   
  22.         private static var _BarWidth:int=200;   
  23.         private static var _BarHeight:int=12;   
  24.         private static var _BarBackground:uint=0xFFFFFF;   
  25.         private static var _BarOuterBorder:uint=0x737373;   
  26.         private static var _BarColor:uint=0x6F9FD5;   
  27.         private static var _BarInnerColor:uint=0xFFFFFF;   
  28.            
  29.         private var isReady:Boolean=false;   
  30.         public var progress:Number;   
  31.         private var _logoData:BitmapData;    
  32.            
  33.             /**   
  34.              * 初始化方法   
  35.              * */   
  36.         public function WelcomeScreen()   
  37.         {   
  38.         }   
  39.         override public function get width():Number   
  40.         {   
  41.             return Math.max(_BarWidth,_LogoWidth)+_LeftMargin+_RightMargin;   
  42.         }   
  43.         override public function get height():Number   
  44.         {   
  45.             return _LogoHeight+_LogoHeight+_Topmargin+_Padding;   
  46.         }   
  47.             /**   
  48.              * 进度条加载完毕后,隐藏进度条   
  49.              * */   
  50.         public function set ready(value:Boolean):void   
  51.         {   
  52.             this.isReady=value;   
  53. //          this.visible=!isReady;   
  54.         }   
  55.         public function get ready():Boolean   
  56.         {   return isReady;     }   
  57.            
  58.             /**   
  59.              * 刷新方法,每个时钟周期都被调用这个函数   
  60.              * */   
  61.         public function refresh():void   
  62.         {   
  63.             _logoData=this.drawProgressBar();   
  64.             var encoder:PNGEncoder=new PNGEncoder();   
  65.             this.loadBytes(encoder.encode(_logoData));   
  66.         }   
  67.             /**   
  68.              * 生成进度条函数   
  69.              * */   
  70.         public function drawProgressBar():BitmapData   
  71.         {   
  72.             //创建bitmapdata对象   
  73.             var data:BitmapData=new BitmapData(this.width,this.height,true,0);   
  74.             //画出bitmapdata   
  75.             var s:Sprite=new Sprite();   
  76.             var g:Graphics=s.graphics;   
  77.             g.beginFill(_BarBackground);   
  78.             g.lineStyle(2,_BarOuterBorder,1,true);   
  79.             var px:int=(this.width-_BarWidth)/2;   
  80.             var py:int=_Topmargin+_LogoHeight+_Padding;   
  81.             g.drawRoundRect(px, py, _BarWidth, _BarHeight, 2);   
  82.             var containerWidth:Number=_BarWidth-4;   
  83.             var progWidth:Number=containerWidth*this.progress/100;   
  84.             g.beginFill(_BarColor);   
  85.             g.lineStyle(1, _BarInnerColor, 1, true);    
  86.             data.draw(s);   
  87.             return data;   
  88.         }       
  89.            
  90.   
  91.     }   
  92. }  

 

http://wwwflex.iteye.com/blog/808484

你可能感兴趣的:(timer,function,Flex,application,Class,encoding)