Patch flex框架能够立即显示预加载器吗?

时间:2008-09-26 07:46:59

标签: flex preloader monkeypatching

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

Adobe docs中,如果在下载700毫秒后下载了不到一半的应用程序,则会指定'显示进度条[预加载器]。'

然而,我总是希望预加载器能够立即显示,因为我知道95%的用户是第一次访问者并且网站超过500kb。我不希望人们必须等待.7秒才能显示预加载器动画。

我认为理论上可以“修补”框架以消除这个.7秒限制。我没有时间弄清楚如何,而且我以前从未这样做过。

有人帮忙吗?

4 个答案:

答案 0 :(得分:7)

您应该只扩展DownloadProgressBar,尝试以下代码。我以前用过这个,我发现了jesse warden网站click here 有关这方面的信息(在那里我发现了它,这是他的代码的缩减版本)

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类。

答案 1 :(得分:1)

这是在showDisplayForDownloading函数的mx.preloaders :: DownloadProgressBar.as,第1205行。

旧学校猴子修补与AS3一起使用,但您可以编辑Flex源代码并自行编译一个新的framework.swc(显然很痛苦),或者只是将其包含在源路径中(源路径覆盖.swcs) ;或从DownloadProgressBar派生您自己的预加载器类,它只会覆盖showDisplayForDownloading并返回true。

您可以在'%PROGRAMFILES%\ Adob​​e \ Flex Builder 3 [Plug-in] \ sdks \ 3.0.0 \ frameworks \ projects \ framework \ src'中找到框架源,然后找到包路径。如果您使用3.1或其他任何内容,请更改sdk版本。

答案 2 :(得分:0)

我猜这种延迟有两个原因:

  1. 您不希望预加载器 一旦页面已经“闪烁”
  2. 预加载器本身必须 负载
  3. 当我需要确保立即显示预加载器时,我会创建一个小包装swf,其中只是预加载器并从那里加载主swf。

答案 3 :(得分:-1)

无法立即显示预加载器,因为在显示进度之前需要下载某些类。另一个替代方案是你可以在html中显示进度,当加载flash影片时它会显示在这里。