Получить класс из моей флеш-библиотеки динамически

В моей флеш-библиотеке есть несколько растровых изображений, которые я экспортировал для ActionScript. Теперь, в зависимости от получаемых мной Flashvars, я хочу загрузить соответствующее растровое изображение библиотеки.

Как динамически загрузить класс растрового изображения?


person Community    schedule 26.03.2009    source источник
comment
Что вы имеете в виду под классом растрового изображения? Картинки?   -  person dirkgently    schedule 26.03.2009
comment
да растровые изображения, которые у меня есть в моей флеш-библиотеке.   -  person    schedule 26.03.2009
comment
Вы уверены, что хотите сохранить свои растровые файлы в библиотеке flash (я полагаю, вы имеете в виду только внешний swf)? Вы можете просто загрузить их напрямую, не оборачиваясь в swf.   -  person dragonfly    schedule 26.03.2009
comment
ну да, я действительно хочу, чтобы они были в моей библиотеке, так как я хочу, чтобы они каким-то образом были встроены.   -  person    schedule 26.03.2009


Ответы (5)


В основном, чтобы прикрепить растровое изображение из библиотеки, вы должны сделать это:

import flash.display.BitmapData;
import flash.display.Bitmap;

var bmp:BitmapData = new ClassNameOfTheBitmap(0, 0);
var img = new Bitmap(bmp);

addChild(img);

Но поскольку вы не знаете имени класса, вам придется динамически создать класс следующим образом:

import flash.display.BitmapData;
import flash.display.Bitmap;

var classNameFromFlashvars:String = "xxx";
var cls:Class = getDefinitionByName(classNameFromFlashvars) as Class;

var bmp:BitmapData = new cls(0, 0) as BitmapData;
var img = new Bitmap(bmp);

addChild(img);

В этом случае имя класса в свойствах связи изображения будет xxx.

person kkyy    schedule 26.03.2009
comment
Не забудьте импортировать утилиту. import flash.utils.getDefinitionByName; - person alvincrespo; 17.02.2011

Вам просто нужно использовать Loader и ApplicationDomain. В других ответах и ​​документации есть хорошие примеры тех. После загрузки внешнего swf вам просто нужно использовать что-то вроде этого, чтобы получить свой класс растрового изображения:

loader.contentLoaderInfo.applicationDomain.getDefinition(className)  as  Class;

Изменить: добавлены ссылки :)

person dragonfly    schedule 26.03.2009
comment
Вы предполагаете, что он хочет загрузить материал из внешнего swf, в то время как он, вероятно, просто хочет загрузить растровое изображение из своей текущей библиотеки swf ... - person kkyy; 26.03.2009

В этом есть смысл. Причина в том, что компилятор не включает ни один из этих классов «во время компиляции», поскольку они никогда не используются, его недостаточно умен, чтобы увидеть, что имена классов могут динамически генерироваться во время выполнения. Итак, в опубликованном SWF-файле нет ни одного из этих классов. Однако после того, как вы даже «упомянете их» в коде, компилятор включит их.

Я думаю, это не идеальная архитектура для динамических имен классов. Может быть, им стоит добавить какие-то силы для настройки компиляции?

person Scottx    schedule 25.11.2011

Я создал класс ex. Мои занятия

    public class MyClass extends MovieClip
    {
       private var testImg:Bitmap = new Bitmap();

       public function MyClass()
       {}

       public function set testImg(value:String):void
       {
          var cls:Class = getDefinitionByName('team_' + value) as Class;

          var bmp:BitmapData = new cls(0, 0);

          testImg = new Bitmap(bmp);

          addChild(testImg);
       }
    }

Например, элементы в моей библиотеке называются team_4534.

Действительно ли MyClass обнаруживает все ресурсы библиотеки? Разве мне не нужно их каким-то образом импортировать или говорить, что они существуют?

person Community    schedule 26.03.2009
comment
он работает в моей среде .fla, но когда я экспортирую его как .SWC для гибкости и использования MyClass (), я получаю сообщение об ошибке ReferenceError: Error # 1065: Variable team_66036 is not defined. at global / flash.utils :: getDefinitionByName () Кажется, он не находит классы. - person ; 26.03.2009
comment
Возможно, возникла проблема с ApplicationDomains. Вы уверены, что в Flex ваш swc импортируется в ApplicationDomain вашего основного приложения? Также ваш класс должен быть общедоступным (очевидно). - person dragonfly; 26.03.2009
comment
в моем приложении он находится под библиотеками, MyClass, конечно, общедоступен. Я могу получить доступ ко всему в MyClass, включая функцию set testImg. Есть ли способ указать библиотеку импорта в MyClass? - person ; 26.03.2009

Хорошо, поэтому я нашел действительно уродливый способ не получить сообщение об ошибке ReferenceError: Error # 1065: Variable team_xxx is not defined '

Я сделал функцию в flex со всеми разными классами из .swc:

    private function logos():void
    {
        team_25502;
        team_25504;
        team_25508;
        team_25509;
        team_25511;
        team_25514;
        team_25517;
        team_25521;
        team_25530;
        team_25591;
        team_66036;
        team_66230;
        team_85230;
        team_89483;
        team_89484;
    }

Если у кого-то есть идея получше, а я уверен, что у кого-то есть, то, пожалуйста, оставьте комментарий.

person Community    schedule 26.03.2009