2

我正在尝试在我的 flex 应用程序中创建/使用预加载器。预加载器是一个 SWF 文件,它有 100 帧(加载器进度的每个百分比为 1)。基本上我试图在我的应用程序中嵌入这个 SWF 文件,将其显示在屏幕上,并在进度完成时更改显示的帧号。

我到目前为止的代码是(它扩展了 Canvas):

[Embed("/../assets/preLoader.swf")]
private var SWFClass:Class;

private var _preLoader:MovieClip;

private var _progress:Number;

public function set progress(value:Number) : void {
    _progress = value;

    if(progress < 100) {
        _preLoader.gotoAndPlay(progress, null);
    }else {
        _preLoader.gotoAndStop(0, null);
    }
}   

[Bindable]
public function get progress() : Number {
    return _progress;
}



(Called on creationComplete event)          
private function init() : void {
    _preLoader = MovieClip(new SWFClass());

    this.addChild(_preLoader);

    _preLoader.play();
}

我得到的错误是:

TypeError: Error #1034: Type Coercion failed: cannot convert widgets::PreLoader_SWFClass@30b3be51 to mx.core.IUIComponent.at mx.core::Container/http://www.adobe.com/2006/flex/mx/internal::addingChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:3259]

请帮忙!

4

5 回答 5

2

您需要有一个MovieClip实现 的包装器IUIComponent才能传递给addChild(). 从addChild() 文档中:

注意:虽然该方法的子参数指定为 DisplayObject 类型,但该参数必须实现 IUIComponent 接口才能添加为容器的子级。所有 Flex 组件都实现了这个接口。

你将需要这样的东西:

public class MovieClipUIComponent extends UIComponent {
   public function MovieClipUIComponent (mc:MovieClip) {
      super ();

      mcHeight = mc.height;
      mcWidth = mc.width;

      // add your own magic

      addChild (mc);
   }
}

警告:未经测试的代码,应该只给你一个想法!

于 2009-03-02T12:01:07.337 回答
2

希望这项工作我试过了。

[Embed(source="assets/yourSWF.swf", mimeType="application/octet-stream")]
public var SWF:Class;

_swfLoader = new Loader();
//nothing to do onComplete or onProgress method just to debug
// Add complete event listener
_swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
// Add progress event listener
_swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);


// Add error event listener. Critical if you don't want run time errors if there
// are problems loading the file.
_swfLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);

// Incase of loading Flex. Very important.
_swfLoader.addEventListener("mx.managers.SystemManager.isBootstrapRoot", systemManagerHandler);
_swfLoader.addEventListener("mx.managers.SystemManager.isStageRoot", systemManagerHandler);

// Load on the loader with a new URLRequest instance passing the path to
// it's constructor.
_swfLoader.loadBytes(new SWF());

// We have to addd the loader so it creation is done.
addChild(_swfLoader);

private function systemManagerHandler(e:Event):void {
            // Prevent default stops default behaviour here and thus stops some potential
            // run time errors.         
            e.preventDefault();
}
于 2010-10-27T14:57:05.063 回答
1

使用 sprite 而不是 Canvas 作为基类。这样做的两个原因:

  1. Canvas 有很多依赖项(多达 10 万多个 flex 组件)。在显示预加载器之前,您不想等待所有这些加载

  2. Canvas 是 UIComponent 容器。当你想要布局 UIComponents 时使用它。在您的情况下,您不需要复杂的画布布局逻辑 - 您只需要显示一个 MovieClip。所以不要使用画布。

为了回答您最初的问题,SWFLoader 和 Image 是知道如何显示位图和影片剪辑的 UIComponent。改为执行以下操作:

var img:Image = new Image();
img.source = _preloader;
this.addChild(img);
于 2009-03-20T23:53:38.737 回答
1

查看Preloader类和 Application 类的preloader属性。

正如文档所说,您绝对不应该为预加载器扩展 Flex UIComponent(或 Image 或 SWFLoader)类。

以下是一些有关如何自定义预加载器的示例:

http://www.pathf.com/blogs/2008/08/custom-flex-3-lightweight-preloader-with-source-code/

http://groups.adobe.com/posts/15d371c71d

http://www.webapper.net/index.cfm/2008/1/17/Flex-NotSo-Custom-Preloader

于 2009-03-24T02:27:59.980 回答
1

我从这个链接http://askmeflash.com/article_m.php?p=article&id=7找到了使用外部 swf 代码的自定义预加载器

于 2009-04-22T08:55:22.643 回答