Apache flex 补丁flex框架立即显示预加载程序?

Apache flex 补丁flex框架立即显示预加载程序?,apache-flex,preloader,monkeypatching,Apache Flex,Preloader,Monkeypatching,在Flex框架中,可以在加载站点时使用自定义预加载程序 在中,它指定“如果在下载700毫秒后下载的应用程序少于一半,则显示进度栏[预加载程序]。” 然而,我总是希望预加载立即出现,因为我知道95%的用户是第一次访问,该网站超过500kb。我不希望人们不得不等待。7秒的预加载动画出现 理论上,我认为有可能通过“猴子补丁”框架来消除这个0.7秒的限制。我没有时间想办法,而且我以前从来没有做过 有人帮忙吗?这是在mx.preloaders::DownloadProgressBar.as中的ShowDi

在Flex框架中,可以在加载站点时使用自定义预加载程序

在中,它指定“如果在下载700毫秒后下载的应用程序少于一半,则显示进度栏[预加载程序]。

然而,我总是希望预加载立即出现,因为我知道95%的用户是第一次访问,该网站超过500kb。我不希望人们不得不等待。7秒的预加载动画出现

理论上,我认为有可能通过“猴子补丁”框架来消除这个0.7秒的限制。我没有时间想办法,而且我以前从来没有做过


有人帮忙吗?

这是在mx.preloaders::DownloadProgressBar.as中的
ShowDisplayforDownload
函数的第1205行

旧式的monkey补丁在AS3中已经过时了,但是您可以编辑Flex源代码并为自己编译一个新的framework.swc(显然很痛苦),或者只将其包含在源代码路径中(source path override.swcs);或者从DownloadProgressBar派生您自己的预加载程序类,该类只覆盖
showDisplayForDownloading
并返回true


您可以在“%PROGRAMFILES%\Adobe\Flex Builder 3[插件]\sdks\3.0.0\frameworks\projects\framework\src”中找到框架源,然后找到包路径。如果您使用的是3.1或其他版本,请更改sdk版本。

您只需扩展DownloadProgressBar,然后尝试以下代码。我以前用过这个,我发现jesse warden网站上有很多关于这个的信息(我在那里发现的,这是他的代码的精简版)

}


在这之后,只需将主应用程序标记中的preload属性更改为preload类。

我猜延迟的存在有两个原因:

  • 您不希望预加载程序 一旦页面已经打开,“闪烁” 缓存
  • 预加载程序本身必须 装载

  • 当我需要绝对确保立即显示预加载程序时,我会制作一个只有预加载程序的小包装swf,然后从那里加载主swf。

    不可能立即显示预加载程序,因为在显示进度之前需要下载一些类。另一种选择是,您可以在html中显示进度,当加载flash电影时,它会显示在这里。

    我建议只对DownloadProgressBar类进行子分类。
    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;
        }
    
    }