修补flex框架以立即显示预加载器吗?

时间:2020-03-06 14:46:14  来源:igfitidea点击:

在Flex框架中,可以在网站加载时使用自定义的预加载器。

在Adobe文档中,它指定"如果在下载700毫秒后下载的应用程序少于一半,则显示进度条[preloader]。"

但是,我一直希望预加载器立即显示,因为我知道我们的用户中有95%是首次访问者,并且该站点超过500kb。我不希望人们必须等待0.7秒才能看到预加载器动画。

从理论上讲,我认为可以对框架进行"猴子补丁"以消除此.7秒的限制。我没有时间想办法,而且我以前从未做过。

有人帮忙吗?

解决方案

它在showDisplayForDownloading函数中的mx.preloaders :: DownloadProgressBar.as中的1205行中。

AS3已经淘汰了老式的猴子修补程序,但是我们可以编辑Flex源代码并自己编译一个新的framework.swc(显然很麻烦),也可以将其包含在源代码路径中(源路径覆盖.swcs);或者从DownloadProgressBar派生我们自己的预加载器类,该类仅覆盖showDisplayForDownloading并返回true。

我们可以在"%PROGRAMFILES%\ Adob​​e \ 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电影时显示进度,但在此处。