`

flex预加载器Preloader

    博客分类:
  • flex
 
阅读更多

Flex的预加载器为 mx.preloaders.Preloader Preloader 加载应用程序和 SystemManager 传入的 RSL 共享库以及资源模块, Preloader 并不包含加载器的界面,它是一个位置为 (0,0) 的空 Sprite ,采用 mx.preloaders.DownloadProgressBar 作为默认的皮肤。 Preloader 在加载过程中发送大量的事件, DownloadProgressBar SystemManger 通过监听 Preloader 的事件显示加载进度和跳帧。 Application preloader 属性可以更改 Preloader 使用的加载界面,默认路径为 mx.preloaders.DownloadProgressBar ,如果你指定其他类,这些类将代替 DownloadProgressBar 被编译到项目中。修改加载界面可以分为两种方式,一是修改默认预加载器样式,即设置 DownloadProgressBar 的属性,二是通过制定类名自定义预加载器皮肤, Preloader 作为功能类无需更改其逻辑。 Application usePreloader:Boolean 属性可以禁用预加载器,但并不会改变 Flex 发布 swf 的结构, swf 依然被编译为 2 帧并且使用 Prelaoder 加载,只是不创建加载外观而已。

修改预加载器样式

 

    DownLoadProgressBar 提供了一些属性用于设置加载器样式,背景样式被声明为 public ,自定义加载界面后仍然可以设置这些属性,绘制的矢量界面和文本标签被声明为 protected ,自定义加载界面后将无法访问。

背景样式

       DownloadProgressBar 并不是只有中间显示的那个加载框,还拥有一个和舞台一样大小的背景色块, backgroundColor:uint,backgroundAlpha:Number 属性可以设置加载器的背景颜色和透明度, backgroundImage:String backgroundSize:String 属性可以设置背景图片和大小, backgroundImage 可以是文件名或类名,设置为文件名后会自动使用内部的 Loader 加载背景图片,但加载背景图片会增加加载 swf 加载时间, backgroundSize 设置背景图片的缩放方式,如果为百分比,则 ”100%” 表示拉伸到背景图片到完整大小,为 ”auto” 表示图片保持大小不变。

      Preloader 在创建 DownLoadProgressBar 时会将背景设置为 Application 的背景颜色,然后调用 DownLoadProgressBar initialize() 方法,我们可以通过覆盖 initiliaze() 方法更改背景设置,例如:

override public function initialize():void

{

        super.initialize();

        backgroundImage="chuyin30.jpg";

        backgroundAlpha=0.2;

}

加载框和加载条

borderRect:RoundedRectangle 可以修改加载框的大小,

barFrameRect:RoundedRectangle barRect:RoundedRectangle 可以修改加载槽和加载条的大小。

这两个属性都是只读的,修改需要覆盖 get 属性。没有修改加载框和加载条颜色的属性,加载框默认为透明的灰色,要自定义加载框和加载条,需要自定义加载界面。

修改加载标签

默认情况下 DownloadProgressBar 只显示了提示标签而没有显示进度标签,我们可以通过 showPercentage:Boolean 属性启用进度标签, showLabel:Boolean 用于扩展显示自定义标签, labelRect:Retangle,labelFormat:TextFormat 修改提示标签的大小和格式, percentRect:Rectangel percentFormat 属性设置进度文本的大小和格式。 label:String 属性为提示标签文本内容,加载应用程序时显示 downloadingLabel:String 属性的值,加载共享库时显示共享库的加载个数。

下图为修改过的 DownloadProgressBar 样式:

flex预加载器Preloader

修改代码如下:

 

package

{

    import mx.graphics.RoundedRectangle;

    import mx.preloaders.DownloadProgressBar;

 

    public class DownloadProgressBar1 extends DownloadProgressBar

    {

 

        public function DownloadProgressBar1()

        {

           super();

        }

 

        override public function initialize():void

        {

           super.initialize();

           backgroundColor=0xAAAAAA;

           downloadingLabel="";

           showPercentage=true;

        }

       

       

        override protected function get borderRect():RoundedRectangle

        {

           return new RoundedRectangle(0, 0, 282, 80, 4);

        }

       

        override protected function get barFrameRect():RoundedRectangle

        {

           return new RoundedRectangle(14, 40, 254, 24);

        }

       

        override protected function get barRect():RoundedRectangle

        {

           return new RoundedRectangle(14, 39, 254, 26, 0);

        }

    }

}

 

DownloadProgressBar1 指定给 Application preload 属性即可看到效果。

 

自定义加载界面

    修改 DownloadProgressBarPreloader 的样式往往不能满足项目高级需求,例如需要将应用程序和资源下载进行分段显示,自定义加载界面需必须实现 IPreloaderDisplay 接口,这个接口包括外观的背景设置,所处的舞台大小等属性,但 Flex 的框架决定了 IPreloaderDisplay Preloader 的耦合度很高,重新编写界面不容易,更多的时候我们选择继承 DownLoadProgressBar 类来简化操作, DownLoadProgressBar 不仅实现 IPreloaderDisplay 接口,而且考虑的非常细致,例如加载所需的时间小于 700m 或启动进度超过总数的一半不显示加载界面。此外 DownLoadProgressBar 更是为我们扩展加载界面提供了有力的支持,某些方法定义了但内容却为空,这就是供我们扩展的提示。

DownloadProgressBar 中的加载框、加载条都是通过代码绘制的,这使得默认加载器的体积很小,绘制的代码在 createChildren() 方法中,而更改进度显示的代码在 setProgress() 方法中,这两个方法实现了显示和逻辑的分离,通过覆盖这两个方法定制自己的加载界面可以在不改变加载逻辑的方式下进行,下面我们让 Flex 使用使用 flash 绘制的界面作为加载器的皮肤:

1.    flash 中新建影片剪辑,绘制所需的界面,如图:

flex预加载器Preloader

    将加载条命名为 progressBar ,进度文本命名为 progressText ,共享库进度条为 rslBar ,共享库文本为 rslText ,然后将元件导出为 ActionScript ,类名为 DownloadProgressBarDisplay ,将 fla 发布为 swc 导入 Flex 后便可以使用 flash 制作的素材了。

2.    覆盖定义

    覆盖定义之前我们要了解 DownloadProgressBar 内部一些实现,为了避免加载速度过快导致加载界面闪动一下就消失, createChildren() 方法在 700ms 后才被调用,如果你想一开始就显示加载界面可以在构造函数中创建界面,但创建的界面不会自动居中,需要自己设置,此时可以利用基类提供的 stageWidth:Number stageHeight:Number 属性访问舞台尺寸,但这个两个属性只有在执行 createChildren() 方法时才变得准确。默认绘制的加载条把显示进度分割为两个阶段,第一个阶段是加载阶段,应用程序将和 rsl 共享库同时加载,第二个阶段是 Application 初始化阶段, DownloadProgressBar 使用属性 DOWNLOAD_PERCENTAGE:uint 进行百分比分割,你可以修改 DOWNLOAD_PERCENTAGE 更改默认进度条分割的百分比,也可以选择不进行分割、,下表为 DownloadProgressBar Preload 添加的侦听器。

 

侦听器

说明

progressHandler(event:ProgressEvent):void

应用程序和共享库加载进度

rslProgressHandler(event:RSLEvent):void

rsl 加载进度

rslCompleteHandler(event:RSLEvent):void

rsl 加载完毕

rslErrorHandler(event:RSLEvent):void

rsl 加载出错

completeHandler(event:Event):void

应用程序和共享库加载完毕

initProgressHandler(event:Event):void

应用程序初始化进度

       progressHandler() initProgressHandler() 都调用 setProgress() 方法设置进度, setProgress() 反映加载总数。 RSLEvent 既可以反映 rsl 共享库的加载进度又可以反映加载数量,通过覆盖 rsl 的侦听器可以单独为 rsl 创建进度条。

    通过对 DownloadProgressBar 的观察使我们了解到,要定制加载界面,起码要覆盖 createChildren() setProgress() 这两个方法,其它方法可以自己选择覆盖, MyDownloadProgressBar 通过覆盖 createChildren() setProgress() 方法引入 flash 制作的界面并且更新进度,如下:

 

package

{

    import flash.events.Event;

   

    import mx.events.RSLEvent;

    import mx.preloaders.DownloadProgressBar;

 

    public class MyDownloadProgressBar extends DownloadProgressBar

    {

        private var downloadDisplay:DownloadProgressBarDisplay;

       

       

        public function MyDownloadProgressBar()

        {

           super();

           downloadDisplay=new DownloadProgressBarDisplay();

        }

       

       

        override protected function createChildren():void

        {

           downloadDisplay.x=(stageWidth-downloadDisplay.width)/2;

           downloadDisplay.y=(stageHeight-downloadDisplay.height)/2;

           addChild(downloadDisplay);

        }

       

       

        override protected function rslProgressHandler(event:RSLEvent):void

        {

           downloadDisplay.rslText.text=" 共享库 "+"("+event.rslIndex+"/"+event.rslTotal+")";

           downloadDisplay.rslBar.scaleX=event.bytesLoaded/event.bytesTotal;

        }

       

       

        override protected function setProgress(completed:Number, total:Number):void

        {

           var per:Number=completed/total;

           downloadDisplay.progressBar.scaleX=per;

           downloadDisplay.progressText.text=(100*per).toFixed(0)+"%";

        }

    }

}

    我们在构造函数中创建了 flash 绘制的加载界面是避免 createChildren() 方法 70ms 后才执行而导致 rslProgressHandler 中无法访问 downloadDisplay 报错,由于 stageWidth stageHeight createChildren() 才能反映准确的舞台尺寸,因此在 createChildren() 中创建 sownloadDisplay 并且设置为舞台居中, rslProgressHandler 使用了独立的进度条反映 rsl 加载进度, setProgress() 反映总的加载进度。

3.    测试加载效果

    将 Flex 框架发布为共享库,然后再导入几个共享库一同进行测试,如下图:

    flex预加载器Preloader

 

    总加载进度会在加载过程中有跳跃的现象,这是因为同时加载应用程序 swf rsl 时,无法一时间获取所有 rsl 的大小,而在 Application 初始化时发生跳动是因为我们没有进行百分比分割。自定义加载界面后, DownloadProgressBar 默认加载器的加载框和加载标签等样式变得没有意义,但加载背景仍然有效,我们仍然可以通过覆盖 initiliaze() 方法设置加载器的背景。

 

封装预加载器

如果能够将预加载器界面和代码封装到一个 swc 中,就可以让任何 Flex 工程使用,通过上面的例子修改如下:

1.    新建影片剪辑,放置 DownloadProgressBarDisplay 的实例,命名为 preloadBox

2.    flash 路径库中导入 Flex framwork.swc

3.    取消 DownloadProgressBarDisplay 的导出

4.    将新影片剪辑导出为 MyDownloadProgressBar

MyDownloadProgressBar 元件绑定的代码 MyDownloadProgressBar.as 如下:

 

package

{

    import flash.events.Event;

   

    import mx.events.RSLEvent;

    import mx.preloaders.DownloadProgressBar;

 

    public class MyDownloadProgressBar extends DownloadProgressBar

    {

        public function MyDownloadProgressBar()

        {

           super();

           preloadBox.visible=false;

        }

       

       

        override protected function createChildren():void

        {

           x=(stageWidth-width)/2;

           y=(stageHeight-height)/2;

           preloadBox.visible=true;

        }

       

       

        override protected function rslProgressHandler(event:RSLEvent):void

        {

           preloadBox.rslText.text=" 共享库 "+"("+event.rslIndex+"/"+event.rslTotal+")";

           preloadBox.rslBar.scaleX=event.bytesLoaded/event.bytesTotal;

        }

       

       

        override protected function setProgress(completed:Number, total:Number):void

        {

           var per:Number=completed/total;

           preloadBox.progressBar.scaleX=per;

           preloadBox.progressText.text=(100*per).toFixed(0)+"%";

        }

    }

}

createChildren() 方法中显示加载界面一来符合基类 70ms 的逻辑,再者舞台大小在 createChildren() 才具备准确的数值。

欢迎访问Java学习者论坛:  http://www.javaxxz.com
分享到:
评论

相关推荐

    flex初始化页面修改,preloader

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

    flex 自定义加载进度框

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

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

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

    Flex启动与初始化

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

    FLEX 系统管理器 SystemManager

    SystemManager不仅负责控制Flex应用的基本元素,如应用窗口、Application实例、弹出窗口和光标,还负责管理ApplicationDomain中的类加载和执行。下面将详细讨论SystemManager的主要功能和工作流程。 1. **应用窗口...

    flex as资料

    4. **预加载器(Preloaders)**:预加载器在应用程序启动时运行,显示加载进度,确保用户看到的不是空白屏幕。如何设计和实现一个自定义预加载器,包括监控资源加载状态、动画效果和用户反馈等。 5. **数据绑定**:...

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

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

    flex事件运行流程

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

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

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

    flex控制桌面背景

    在处理桌面背景这样的任务时,可能用到预加载器来确保所有必要的资源(如图片或皮肤)在改变桌面背景前已完全加载。 其次,`WSBackgroundPixelSkinExample.mxml` 文件很可能是一个示例程序,展示了如何使用Flex的...

    [转] [Flash/Flex] 加载SWF性能VS影片剪辑性能

    - 利用预加载器(Preloader)来显示加载进度,提升用户体验。 - 动态加载资源,根据需要加载非必要的SWF,降低初始加载时间。 总之,SWF加载和影片剪辑都有其适用的场景和限制,开发者需要根据项目需求,结合性能...

    Flex高级组件详细介绍

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

    Flex Flash的关系分析

    preloader帧用于显示应用程序的加载进度,一旦加载完成,进入Application帧,就会创建并初始化Flex的主应用程序(Application类的实例)。这个过程中,Flex应用会经历以下几个关键阶段: - preinitialize:应用实例...

    Flixel创建一个自上而下RPG游戏

    - **Preloader.as**:负责加载资源的预加载器。 #### 四、启动Flixel Flixel是基于ActionScript 3的一个2D游戏引擎,它被设计为支持位图图像(光栅图形)而非Flash的矢量图形。虽然可以使用Flash的MovieClips,但...

Global site tag (gtag.js) - Google Analytics