修补flex框架以立即显示预加载器吗?
在Flex框架中,可以在网站加载时使用自定义的预加载器。
在Adobe文档中,它指定"如果在下载700毫秒后下载的应用程序少于一半,则显示进度条[preloader]。"
但是,我一直希望预加载器立即显示,因为我知道我们的用户中有95%是首次访问者,并且该站点超过500kb。我不希望人们必须等待0.7秒才能看到预加载器动画。
从理论上讲,我认为可以对框架进行"猴子补丁"以消除此.7秒的限制。我没有时间想办法,而且我以前从未做过。
有人帮忙吗?
解决方案
它在showDisplayForDownloading函数中的mx.preloaders :: DownloadProgressBar.as中的1205行中。
AS3已经淘汰了老式的猴子修补程序,但是我们可以编辑Flex源代码并自己编译一个新的framework.swc(显然很麻烦),也可以将其包含在源代码路径中(源路径覆盖.swcs);或者从DownloadProgressBar派生我们自己的预加载器类,该类仅覆盖showDisplayForDownloading
并返回true。
我们可以在"%PROGRAMFILES%\ Adobe \ Flex Builder 3 [插件] \ sdks \ 3.0.0 \ frameworks \ projects \ framework \ src"中找到框架源,然后在包路径中找到。如果我们使用的是3.1或者其他版本,请更改sdk版本。
我们应该只扩展DownloadProgressBar,请尝试以下代码。我以前用过,我发现jesse warden网站单击此处可获取有关此信息的信息(我在这里找到了有关信息,这是他代码的简化版本)
package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.ProgressEvent; import mx.events.FlexEvent; import mx.preloaders.DownloadProgressBar; public class Preloader extends DownloadProgressBar { /** * The Flash 8 MovieClip embedded as a Class. */ [Embed(source="yourPreloaderFile.swf")] private var FlashPreloaderSymbol:Class; private var clip:MovieClip; public function Preloader() { super(); clip = new FlashPreloaderSymbol(); addChild(clip); } public override function set preloader(preloader:Sprite):void { preloader.addEventListener( FlexEvent.INIT_COMPLETE , onFlexInitComplete ); centerPreloader(); } private function centerPreloader():void { x = (stageWidth / 2) - (clip.width / 2); y = (stageHeight / 2) - (clip.height / 2); } private function onFlexInitComplete( event:FlexEvent ):void { dispatchEvent( new Event( Event.COMPLETE ) ); } protected override function showDisplayForDownloading(time : int, event : ProgressEvent) : Boolean { return true; } }
}
之后,只需将主应用程序标签中的preloader属性更改为Preloader类。
我猜那里的延迟有两个原因:
- 我们不希望预加载器在页面已被缓存后"闪烁"
- 预加载器本身必须加载
当我需要确保立即显示预加载器时,我制作了一个仅包含预加载器的小型包装SWF文件,并从那里加载主SWF文件。
不能使预加载器立即显示,因为需要先下载一些类才能显示进度。另一种选择是在html中显示进度,并在加载Flash电影时显示进度,但在此处。