Загрузите и воспроизведите встроенный SWF-файл во Flex / Actionscript - PullRequest
2 голосов
/ 02 марта 2009

Я пытаюсь создать / использовать предварительный загрузчик в моем приложении 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]

Пожалуйста, помогите!

Ответы [ 5 ]

2 голосов
/ 27 октября 2010

Надеюсь, эта работа Я попробовал это.

[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();
}
2 голосов
/ 02 марта 2009

Вам нужно иметь оболочку над 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);
   }
}

Предупреждение: непроверенный код, должен дать вам только представление!

1 голос
/ 22 апреля 2009

я нашел пользовательский предварительный загрузчик, использующий внешний SWF-код по этой ссылке
http://askmeflash.com/article_m.php?p=article&id=7

1 голос
/ 24 марта 2009

Посмотрите на класс Preloader и свойство preloader класса Application.

Как сказано в документации, вам определенно не следует расширять классы 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

1 голос
/ 21 марта 2009

Использование спрайта вместо Canvas в качестве базового класса. Для этого есть две причины:

  1. У Canvas много зависимостей (на 100 000+ компонентов flex). Вы не хотите ждать, пока все это загрузится, прежде чем отобразить ваш предзагрузчик

  2. Canvas - контейнер UIComponent. Используйте его, когда хотите выложить UIComponents. В вашем случае вам не нужна сложная логика макета холста - вам просто нужно отобразить мувиклип. Поэтому не используйте холст.

Чтобы ответить на ваш первоначальный вопрос, SWFLoader и Image являются UIComponents, которые знают, как отображать растровые изображения и мувиклипы. Сделайте что-то вроде этого:

var img:Image = new Image();
img.source = _preloader;
this.addChild(img);
...