2009-03-02 6 views
2

Я пытаюсь создать/использовать предварительный загрузчик в моем приложении flex. Предзагрузчик представляет собой SWF-файл, который имеет 100 кадров (1 для каждого процента хода загрузчика). В основном я пытаюсь встроить этот SWF-файл в свое приложение, отобразить его на экране и изменить отображаемый номер кадра по мере завершения выполнения.Загрузите встроенный SWF-файл в Flex/Actionscript

код у меня до сих пор (который расширяет 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::[email protected] 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] 

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

ответ

1

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

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

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

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

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

Я собирался обновить этот вопрос с помощью этого метода в какой-то момент. Именно это я и сделал. Благодарю. –

2

Для того, чтобы перейти на addChild(), у вас должна быть обертка над MovieClip, которая реализует IUIComponent. Из addChild()documentation:

Примечание: В то время как ребенок аргумент метода указан как тип 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); 
    } 
} 

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

+0

Привет, спасибо за Ваш ответ. Нет ли каких-либо документооборотов для этого? : s Кажется немного странным. Приветствия. –

+0

Достаточно тривиально реализовать оболочку. См. Подсказку в моем обновленном ответе. – dirkgently

1

Посмотрите на 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

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(); 
}