Загружайте и воспроизводите встроенный SWF-файл в Flex / Actionscript
-
03-07-2019 - |
Вопрос
Я пытаюсь создать / использовать загрузчик в моем приложении 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]
Пожалуйста, помогите!
Решение
Используйте sprite вместо Canvas в качестве базового класса.Две причины сделать это:
Canvas имеет множество зависимостей (более 100 тысяч компонентов flex).Вы же не хотите ждать, пока все это загрузится, прежде чем отображать ваш предварительный загрузчик
Canvas - это многокомпонентный контейнер.Используйте его, когда вы хотите разложить UIComponents по полочкам.В вашем случае вам не нужна сложная логика компоновки canvas - вам просто нужно отобразить MovieClip.Так что не используйте холст.
Чтобы ответить на ваш первоначальный вопрос, SWFLoader и Image - это UIComponents, которые знают, как отображать растровые изображения и видеоролики.Вместо этого сделайте что-то вроде этого:
var img:Image = new Image();
img.source = _preloader;
this.addChild(img);
Другие советы
Поверх тебя должна быть обертка 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);
}
}
Предупреждение:Непроверенный код, должен дать вам только представление!
Надеюсь, это сработает Я пробовал это.
[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();
}
Взгляните на the Предварительный загрузчик класс и предварительный загрузчик свойство класса 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
я нашел пользовательский предварительный загрузчик, используя внешний swf-код по этой ссылке
http://askmeflash.com/article_m.php?p=article&id=7