`
hjy2099
  • 浏览: 261475 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Flex 预载界面美化 Flex's preloader is not so flex

    博客分类:
  • Flex
阅读更多

转自: http://riashanghai.com/zh-hant/node/48

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

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

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

3. 载入进度条。

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

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

把网上的资料总结一下,这里放个三合一的例子。最终效果预览,

loader

 

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

 

  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>  
<?xml version="1.0" encoding="utf-8"?>


...

 

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

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

 

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

	}
}

图片logo层的实现方式是

 

  1. package com.ibsol.view   
  2. {   
  3.     import flash.display.Loader;   
  4.     import flash.utils.ByteArray;   
  5.        
  6.     public class WelcomeLogo extends Loader   
  7.     {   
  8.         [Embed(source="assets/preloader.png", mimeType="application/octet-stream")]   
  9.         public var WelcomeScreenGraphic:Class;   
  10.         public function WelcomeLogo()   
  11.         {   
  12.             this.loadBytes(new WelcomeScreenGraphic() as ByteArray);   
  13.         }   
  14.   
  15.     }   
  16. }  
package com.ibsol.view
{
	import flash.display.Loader;
	import flash.utils.ByteArray;
	
	public class WelcomeLogo extends Loader
	{
		[Embed(source="assets/preloader.png", mimeType="application/octet-stream")]
		public var WelcomeScreenGraphic:Class;
		public function WelcomeLogo()
		{
			this.loadBytes(new WelcomeScreenGraphic() as ByteArray);
		}

	}
}

 

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

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

 

  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.     import flash.utils.ByteArray;   
  8.        
  9.     import mx.graphics.codec.PNGEncoder;   
  10.        
  11.     public class WelcomeScreen extends Loader   
  12.     {   
  13.         //辅助属性,帮助进行进度条的定位   
  14.         private static var _LogoWidth:int = 300;   
  15.         private static var _LogoHeight:int = 180;   
  16.         private static var _LeftMargin:int = 5;   
  17.         private static var _RightMargin:int = 5;   
  18.         private static var _TopMargin:int = 1;   
  19.         private static var _BottomMargin:int = 1;   
  20.         private static var _Padding:int = -60;   
  21.         //Progress bar settings   
  22.         //进度条的设定,比如显色边框等   
  23.         private static var _BarWidth:int = 200;   
  24.         private static var _BarHeight:int = 12;   
  25.         private static var _BarBackground:uint  = 0xFFFFFF;   
  26.         private static var _BarOuterBorder:uint = 0x737373;   
  27.         private static var _BarColor:uint = 0x6F9FD5;   
  28.         private static var _BarInnerColor:uint = 0xFFFFFF;   
  29.            
  30.         private var isReady:Boolean = false;   
  31.         public  var progress:Number;   
  32.         private var _logoData : BitmapData;   
  33.            
  34.         public function WelcomeScreen()   
  35.         {   
  36.             //this.loadBytes(new WelcomeScreenGraphic() as ByteArray);   
  37.         }   
  38.            
  39.         override public function get width() : Number   
  40.         {   
  41.             return Math.max(_BarWidth, _LogoWidth) + _LeftMargin + _RightMargin;   
  42.         }   
  43.            
  44.         override public function get height() : Number   
  45.         {   
  46.             return _LogoHeight + _BarHeight + _Padding + _TopMargin + _BottomMargin;   
  47.         }   
  48.         /**  
  49.         * 进度载入完毕后,隐藏进度条  
  50.         */  
  51.         public function set ready(value : Boolean) : void  
  52.         {   
  53.             this.isReady = value;   
  54.             this.visible = !this.isReady;   
  55.         }   
  56.            
  57.         public function get ready() : Boolean { return this.isReady; }   
  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.         private function drawProgressBar():BitmapData   
  71.         {   
  72.             // create bitmap data to create the data   
  73.             var data : BitmapData = new BitmapData(this.width, this.height, true, 0);   
  74.             // draw the progress bar   
  75.             var s:Sprite = new Sprite();   
  76.             var g:Graphics = s.graphics;   
  77.             // draw the bar background   
  78.             g.beginFill(_BarBackground);   
  79.             g.lineStyle(2, _BarOuterBorder, 1, true);   
  80.             var px : int = (this.width - _BarWidth) / 2;   
  81.             var py : int = _TopMargin + _LogoHeight + _Padding;   
  82.             g.drawRoundRect(px, py, _BarWidth, _BarHeight, 2);   
  83.             var containerWidth : Number = _BarWidth - 4;   
  84.             var progWidth:Number = containerWidth * this.progress / 100;   
  85.             g.beginFill(_BarColor);   
  86.             g.lineStyle(1, _BarInnerColor, 1, true);   
  87.             //根据progress进度,来画出进度条的长度   
  88.             g.drawRect(px + 1, py + 1, progWidth, _BarHeight - 3);   
  89.             data.draw(s);   
  90.             return data;   
  91.         }   
  92.   
  93.     }   
  94. }  
分享到:
评论
1 楼 jeaken 2010-08-20  
WelcomeScreen和WelcomeLogo怎么没有呢?

相关推荐

    美丽的Flex Preloader控件,页面预加载效果

    美丽的Flex Preloader控件,页面预加载效果 美丽的Flex Preloader控件,页面预加载效果 美丽的Flex Preloader控件,页面预加载效果 美丽的Flex Preloader控件,页面预加载效果

    flex初始化页面修改,preloader

    在Flex应用程序开发中,用户首次启动应用时会看到一个加载屏幕,这个屏幕通常被称为预加载器(Preloader)。预加载器的主要目的是显示应用程序加载的进度,同时为用户提供一种视觉反馈,让他们知道程序正在准备运行...

    flex 自定义加载进度框

    在Flex应用中,"预加载器"(preloader)是程序启动时显示的一个组件,它的主要功能是在用户等待整个应用程序完全加载时提供反馈。预加载器通常会显示一个进度条,以指示应用程序资源的加载进度。 在“flex自定义...

    flex事件运行流程

    首先,Flex应用程序的启动始于`preloader`阶段,系统管理器(SystemManager)随之创建。SystemManager是Flex应用的核心管理者,它负责应用程序窗口、Application实例、弹出窗口、光标管理,以及ApplicationDomain中的...

    flex控制桌面背景

    首先,`Preloader.as` 是一个常见的Flex组件,它负责在应用程序加载之前显示进度条,提高用户体验。在处理桌面背景这样的任务时,可能用到预加载器来确保所有必要的资源(如图片或皮肤)在改变桌面背景前已完全加载...

    FLEX 系统管理器 SystemManager

    在Flex开发中,SystemManager是一个至关重要的核心组件,它扮演着整个应用程序的管理者角色。SystemManager不仅负责控制Flex应用的基本元素,如应用窗口、Application实例、弹出窗口和光标,还负责管理Application...

    Flex企业应用开发实战源代码

    Flex企业应用开发实战源代码 本书由业界4位拥有近10年企业级应用开发经验的资深专家撰写,权威性毋庸置疑。 全书共分为4大部分,涵盖企业级应用开发的整个生命周期。首先介绍了Flex/Flash的工作机理和利用Flex开发...

    Flex高级组件详细介绍

    - **自定义Preloader**:创建自定义预加载器以增强用户体验。 - **自定义图表组件**:根据业务需求设计和实现定制化的图表组件。 - **高级皮肤专题**:深入探讨如何使用Flex Skin框架为组件创建自定义外观。 - **...

    FLEX企业应用开发实战.part1

     1.1 B/S企业应用开发者的噩梦  1.2 噩梦结束,新时代来临  1.3 Flex概述  1.4 Flash Player的工作模型  1.4.1 Flash Player的帧执行模型  1.4.2 Flash Player渲染模型  1.4.3 Flash中的事件机制  ...

    FLEX企业应用开发实战.part2

     1.1 B/S企业应用开发者的噩梦  1.2 噩梦结束,新时代来临  1.3 Flex概述  1.4 Flash Player的工作模型  1.4.1 Flash Player的帧执行模型  1.4.2 Flash Player渲染模型  1.4.3 Flash中的事件机制  ...

    Flex启动与初始化

    在 Flex 启动过程中,SystemManager 会创建一个加载器(Preloader),用于加载应用程序所需的资源。加载器是一个 2 帧的 MovieClip,第一帧用于创建加载器,第二帧用于加载应用程序。加载器的外观是通过代码绘制的。...

    flex as资料

    压缩包中的文件名“simple_preloader_2307”可能是一个简单的预加载器(preloader)示例。在Flex应用中,预加载器是加载应用程序的主要组件,它在主应用程序完全加载之前显示进度,以提高用户体验。这个文件可能是用...

    Flex组件生命周期[收集].pdf

    Flex应用的根对象是SystemManager,这是一个Display Class,继承自flash.display.MovieClip,使得预加载器(Preloader)和应用程序(Application)可以在两个不同的帧中运行。SystemManager有一个...

    Flex 图 片 显 示

    在Flex开发中,图片显示是常见的需求,尤其是在创建用户界面或者进行数据可视化时。Flex Builder 3是一款由Adobe推出的集成开发环境(IDE),专门用于构建基于Flex的应用程序。本篇文章将详细探讨如何在Flex Builder...

    Flex Flash的关系分析

    因此,可以说Flex是Flash的一个高级封装,提供了更丰富的组件库和强大的开发工具,使得开发者能够更高效地构建交互式用户界面。 1、Flex应用程序的生命周期 Flex应用的生命周期与Flash应用有所不同,因为Flex应用...

    BRUSHED-METAL-PRELOADER.rar_FlashMX/Flex源码_FlashMX_

    通过研究和修改这个“BRUSHED METAL PRELOADER”源码,开发者可以学习到如何创建自定义、交互式的预加载器,并将其应用于自己的Flash MX或Flex项目中,提升网站的用户体验。同时,这也是一个深入了解ActionScript...

    PreLoader-Animation:使用HTML,CSS的页面的预加载器动画

    在网页设计中,预加载器动画(PreLoader Animation)是一种重要的用户体验优化技术,尤其是在处理大容量内容或复杂交互的网站中。预加载器是页面在完全加载之前展示的一个视觉反馈,它告诉用户页面正在准备就绪,...

    modular

    5. **优化加载**: 为了提高性能,可以利用Flex的模块预加载策略,如使用`Preloader`类来控制模块的加载顺序和时机。同时,可以考虑使用`swfobject`等库来实现渐进式增强,让不支持Flash的用户也能访问部分内容。 6....

    flex Custom loading example

    网上找了很多都不完整,上传一个工程给大家分享,采用子类加载swf或者gif的方式显示loading ,gif或者swf文件可以随意换成自己喜欢的。...压缩包内容:preloader和button两种方式显示loading fex3源码

Global site tag (gtag.js) - Google Analytics