Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   MXML импорт симвоов (http://www.flasher.ru/forum/showthread.php?t=124118)

Kennysp 21.04.2009 17:33

MXML импорт симвоов
 
Вопрос в следующем:

Как получить доступ к объектам (например к изображениям) внутри swf, скомпилированной из MXML
Т.е. есть mxml файл
Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
        <mx:Image source="@Embed('image1.jpg')" id="image1"/>
<mx:Image source="@Embed('image2.jpg')" id="image2"/>
<mx:Image source="@Embed('image3.jpg')" id="image3"/>
.........
<mx:Image source="@Embed('image100.jpg')" id="image100"/>
</mx:Application>

Компилируем его из командной строки, получаем swf.
Как теперь получить доступ к изображению image1?

При использовании linkage -> Export for ActionScript все ясно:
Код:

[Embed(source="test.swf", symbol="SymbolName")]
А вот как из MXML сделать символы доступными для импорта ...

wvxvw 21.04.2009 18:47

В случае с Image, это будет (Object(myImage.content).constructor as Class). А в случае с любым другим компонентом это может быть что угодно... а почему именнo Image нужен?

Kennysp 21.04.2009 19:07

Задача такая: вместо того чтобы грузить множество картинок- запаковать их в swf и загрузить одним файлом. Картинок много, поэтому вставлять в библиотеку флэша и отмечать у каждой Export for ActionScript - не выход.
Подумал использовать компиляцию из xmxl - програмно сгенерировали xmxl, скомпилировали swf - готово.
После этого в основном приложении загружаем полученную swf с помощью loader и достаем картинки.

Код AS3:

Object(myImage.content).constructor as Class

Не совсем понял Вас. Это сделает картинки доступными после загрузки Loader`ом?

Изменю свой вопрос:
Есть mxml, в котором объявлен класс (ResoursesClass скажем). После компиляции мы получили resourses.swf.
Как мне получить доступ к ResoursesClass после загрузки loader`ом?

wvxvw 21.04.2009 19:55

Ммм... нет, так вы можете получить ссылку на класс, который был сгенерирован врезультате ембеда (только после того, как картинка была загружена).
Но я бы сказал, что это не удобно... для вашей ситуации... а почему нельзя сгенерить те же теги ембедов? Так загружаемая флешка получится гораздо меньше в размере, да и вообще мороки меньше...
т.е. генерим такой вот MXML:
Код:

<fl:Sprite xmlns:fl="flash.display.*" xmlns:mx="..." implements="IAssets"/>
<mx:Script>
<![CDATA[
[Embed(source="path/to/${file}.jpeg", mimeType="image/jpeg")]
private var ${file}ASSET:Class;

[Embed(source="path/to/${file1}.jpeg", mimeType="image/jpeg")]
private var ${file1}ASSET:Class;
....
/** IAssets implementation */
public function getDefinitions():Array /** of classes */
{
    return [${file}ASSET, ${file1}ASSET, .... ${fileN}ASSET];
}
]]>
</mx:Script>
</fl:Sprite>

Вместо ${file} соответственно подставляем имя нужного файла.

Это не нужно генерить каждый раз, одного раза достаточно:
Код AS3:

package 
{
public interface IAssets {
function getDefinitions():Array;
}

В загружающей флешке:
Код AS3:

(myLoader.content as IAssets).getDefinitions()[0]; // будет классом соответствующим первой картинке


Kennysp 22.04.2009 16:15

wvxvw, спасибо большое.

Добавлено через 35 минут
Не совсем понял с интерфейсом IAssets
Есть mxml:
Цитата:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<fl:MovieClip xmlns:fl="flash.display.*" implements="IAssets">
<mx:Script>
<![CDATA[
[Embed(source="Image1.jpg", mimeType="image/jpeg")]
private var Image1Class:Class;

/** IAssets implementation */
public function getDefinitions():Array {
return [Image1Class];
}
]]>
</mx:Script>
</fl:MovieClip>
</mx:Application>
Есть тестовое приложение:
Код AS3:

package {
        import flash.display.Loader;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
        import classes.IAssets; 
 
        public class testLoad extends Sprite
        {
                private var loader: Loader = new Loader;
 
                public function testLoad(){
                        addChild(loader);
                        var path: String = 'test6.swf';
                        var request:URLRequest = new URLRequest(path);                                 
            loader.load(request);
            loader.contentLoaderInfo.addEventListener( Event.COMPLETE, loaded);       
                }
 
                private function loaded(e){
                        trace((loader.content as IAssets));        <font color="DarkRed"// выводит null
                }
        }
}

Есть файл classes/IAssets.as:
Код AS1/AS2:

package classes{
        public interface IAssets {
                function getDefinitions():Array;
        }
}

В результате после загрузки строчка
Код AS3:

trace((loader.content as IAssets));

выводит null

wvxvw 22.04.2009 18:04

Так вы не имплементили интерфейс - естественно, если вы будете приводить типы ничего не получится...
Т.е. вы имплементите разные интерфейсы, IAssets и classes.IAssets.
И зачем вы туда запихали <mx:Application>? он там вообще не нужен...

7thsky™ 22.04.2009 22:14

Еще можно запихнуть картинки в CSS и не париться. Определить селектор с картинками и его и использовать везде.

типа:

Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
        xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="absolute"
        creationComplete="{processInit()}"
        >

        <mx:Style>

                CommonImages
                {
                        image-1: Embed(source="assets/image1.jpg");
                        image-2: Embed(source="assets/image2.jpg");
                        image-3: Embed(source="assets/image3.jpg");
                }

        </mx:Style>

        <mx:HBox id="container" horizontalCenter="0" verticalCenter="0">
                <mx:Image source="{StyleManager.getStyleDeclaration ('CommonImages').getStyle ('image1')}"/>
                <mx:Image source="{StyleManager.getStyleDeclaration ('CommonImages').getStyle ('image2')}"/>
                <mx:Image source="{StyleManager.getStyleDeclaration ('CommonImages').getStyle ('image3')}"/>
        </mx:HBox>

        <mx:Script>
                <![CDATA[

                        private function processInit ():void {

                                var AssetClass:Class = StyleManager.getStyleDeclaration ('CommonImages').getStyle ('image1');
                                var instance:Bitmap = new AssetClass ();

                                rawChildren.addChild (instance);

                        }
                ]]>
        </mx:Script>
       
</mx:Application>

getStyle возвращает класс который расширяет в итоге простой flash.display.Bitmap (AssetClass -> BitmapAsset -> FlexBitmap ->Bitmap) так что добавить его просто в контэйнер не получится...

wvxvw 22.04.2009 23:40

@ 7thsky™:
Ну только вот зачем человеку в ресурсах тащить весь фреймворк если ему от туда 5 классов нужно? Разница между 5К и 150К все-таки не такая уж маленькая...

7thsky™ 23.04.2009 00:06

Ох боже ты мой wvxvw - человек использует mx.core.Application из Flex'а? использует mx.controls.Image? (первый пост человека в этом треде)- туда уже все эти классы включенны. О чем спорить собираемся?

Вопрос в теме про флекс - решение соответственно флексовое. Правильное флексовое решение - это стили. плюсы очевидны - возможность байндить + рантайм загрузска CSS модулей.

Можно реализовать каcтомные решения типа Вашего, все будет работать, вопрос только зачем когда уже есть встроенный механизм.

wvxvw 23.04.2009 01:28

По-моему из того же первого поста ясно видно, что человеку Application и Image ни во что не уперся, и он просто не знает, как то же самое можно сделать проще и гораздо эффективнее. Это вообще абсурд предлагать встроить в библиотеку картинок весь фреймворк только ради того, чтобы эти картинки можно было встраивать как стили... Мое решенее ни чуть не менее "Флексовое", оно просто на 150К меньше весит и компилироваться будет быстрее...

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


Часовой пояс GMT +4, время: 12:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.