#flash #apache-flex #actionscript
#flash #apache-flex #actionscript
Вопрос:
Когда вы встраиваете носитель во FLash Builder, как показано ниже, он создает класс для ссылки
[Embed(source="images/list.png")]
protected static const LIST_ICON:Class;
Какой класс это создает? И если бы у меня была библиотека swc, которая содержала BitmapData, как бы я в коде создавал такой же класс, используя BitmapData из моего swc?
У меня есть SWC с BitmapData
В моем файле есть XML-файл, который определяет, какое растровое изображение я использую
затем я получаю класс, выполняя
var ClassReference:Class = getDefinitionByName("ImageData") as Class;
«ImageData» является примером для любого текста, который отправляет xml… таким образом, он динамически решает, какой swc-класс извлекать.
После этого мне нужно использовать это для создания класса, который, как я предполагаю, расширяет BitmapAsset, содержащий выбранные BitmapData … таким образом, эмулируя внедрение из первых двух строк выше.
Конечным результатом является то, что у меня есть система, которая вызывает
getQualifiedClassName(SomeClass)
Класс, которому это передается, затем использует
getDefinitionByName("passedName")
чтобы получить класс и, следовательно, содержащие BitmapData.
Это немного сложно, но я должен сделать это таким образом, чтобы сохранить его динамичным с моей стороны … не могу изменить код, который обрабатывает переданные ему данные. Он должен передаваться по имени
Я надеялся, что это будет проще, но я начинаю думать, что было бы проще встроить все это обычным способом и сделать простой переключатель, который использует другое встраивание в зависимости от того, что говорит XML
Ответ №1:
Если вы ознакомитесь с документацией (http://livedocs.adobe.com/flex/3/html/help.html?content=embed_4.html ) в Embed
метаданных показано, что изображение будет встроено с типом mx.core.BitmapAsset
(то есть ваш класс LIST_ICON расширяет BitmapAsset).
С поправкой на ваше встраивание код был бы:
[Embed(source="images/list.png")]
protected static const LIST_ICON:Class;
...
var imgObj:BitmapAsset = new LIST_ICON() as BitmapAsset;
Проверьте ссылку выше для получения полного примера кода.
Комментарии:
1. Я добавил более подробную информацию о том, что я пытаюсь сделать
Ответ №2:
Вы можете создать экземпляр вашего изображения с помощью var listIcon:LIST_ICON = new LIST_ICON();
.
и вы можете назначить это источнику изображения как
image.source = listIcon;
Ответ №3:
Когда вы встраиваете ресурс, он становится новым классом в swf. Вам нужно имя этого класса. Это недокументировано (afaik), но вы можете получить его из проанализированного swf. Например, если я возьму свою простую программу TerrainGenerator.as скомпилируйте его и проанализируйте с помощью SWiX, я вижу следующий SymbolClass:
<SymbolClass>
<Symbol Tag="0" Name="TerrainGenerator" />
</SymbolClass>
Это основной класс, ничего необычного. Далее, если я добавлю Embed следующим образом
public class TerrainGenerator {
[Embed(source="SOME_PNG.PNG")]
public static const IMAGE_RESOURCE:Class;
...
Я получу следующее:
<SymbolClass>
<Symbol Tag="1" Name="TerrainGenerator_IMAGE_RESOURCE" />
<Symbol Tag="0" Name="TerrainGenerator" />
</SymbolClass>
И если я перемещу это встроенное в класс resource
в package somepackage
, это станет:
<Symbol Tag="1" Name="somepackage.resource_IMAGE_RESOURCE" />
Итак, существуют правила для генерации имен этих классов, и мы можем изучить их с помощью swf parser.