Преобразование JPG в класс во время выполнения - PullRequest
1 голос
/ 09 января 2009

Некоторые методы в API Flex, такие как CursorManager.setCursor (cursorClass: Class, priority: int = 2, xOffset: Number = 0, yOffset: Number = 0) принимают параметр типа Class для графика. В этом примере вы можете указать JPG / BMP / SWF в качестве курсора, но я знаю, что для получения класса из файла изображения используется [Embed] в MXML, и в моем случае это необходимо сделать динамически в AS3.

Должно быть стандартное решение? Есть ли веская причина, по которой эти классы Flex занимают в первую очередь класс?

РЕДАКТИРОВАТЬ: на самом деле меня не волнует эмуляция поведения тега [Embed]. Я просто хочу иметь возможность использовать путь к файлу изображения с CursorManager. Я уверен, что видел, как это делалось в других ситуациях, и наверняка люди из Flex полагали, что эти вещи не всегда будут жестко закодированы?

РЕДАКТИРОВАТЬ2: Чтобы еще больше упростить проблему, я в идеале ищу способ сделать следующее: CursorManager.setCursor(someHandyFunction("myCursor.png")) Если это вообще возможно, вопрос в том, что someHandyFunction должен делать?!

Ответы [ 4 ]

4 голосов
/ 10 января 2009

Это выглядело интересно, поэтому я решил попробовать его. Вот то, что я смог сделать - возможно, есть более элегантное решение, но я проверил его, и оно определенно работает ( вот рабочий пример ), поэтому я решил отбросить его Вам еще повозиться, если хотите.

Во-первых, вам понадобится собственный класс, расширяющий DisplayObject - я просто выбрал Bitmap, так как знал, что вы пытаетесь загрузить и использовать изображения JPG:

package
{
    import flash.display.Bitmap;
    import mx.core.Application;

    public class MyLoadedImageClass extends Bitmap
    {       
        public function MyLoadedImageClass()
        {
            // ClassRef is simply the name of my Flex app
            super(ClassRef(Application.application).bitmapData);
        }
    }
}

... а затем вот код приложения, который просто загружает вещи и затем вызывает setCursor ():

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

    <mx:Script>
        <![CDATA[

            import mx.managers.CursorManager;
            import mx.managers.CursorManagerPriority;

            // This public member holds a reference to your loaded bitmapData,
            // which MyLoadedImageClass's constructor will use when instantiated
            // by the framework during CursorManager.setCursor()
            public var bitmapData:BitmapData;

            // Here we load the image
            private function init():void
            {
                var urlLoader:URLLoader = new URLLoader();
                var urlRequest:URLRequest = new URLRequest("http://roaming.turbonerd.com/m/20090104094515.jpg");

                urlLoader.addEventListener(Event.COMPLETE, urlLoader_complete);
                urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
                urlLoader.load(urlRequest); 
            }

            // Here we translate the bytes into a Bitmap
            private function urlLoader_complete(event:Event):void
            {
                var bytes:ByteArray = URLLoader(event.target).data;

                var loader:Loader = new Loader();
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
                loader.loadBytes(bytes); 
            }

            // And finally, we save off the bytes and set the cursor 
            private function loader_complete(event:Event):void
            {
                bitmapData = Bitmap(event.target.content).bitmapData;
                CursorManager.setCursor(MyLoadedImageClass, CursorManagerPriority.HIGH);
            }

        ]]>
    </mx:Script>

</mx:Application>

Надеюсь, комментирование описывает вещи достаточно подробно. Надеюсь, поможет! (И спасибо за вызов!)

1 голос
/ 13 марта 2010

Я недавно боролся с CursorManager (пытался заставить его загружать png-курсоры во время выполнения), и в результате я разместил служебный класс в моих лабораториях blog .

1 голос
/ 15 сентября 2009

Проверьте этот пример класса от Бен Стуки. Я широко использовал его для динамического создания экземпляров классов из удаленного JPG / GIF / PNG.

http://blog.benstucki.net/?p=42

0 голосов
/ 09 января 2009

Насколько я знаю, в настоящее время невозможно создать классы во время выполнения внутри flash vm, используя as3. Теоретически вы можете создать SWF-файл с нужным вам классом во время выполнения, записав swf-данные в байт-массив и загрузив его, я не рекомендую вам попробовать это, если вы не слишком озадачены и не против большого разочарования; -)

Если вы немного уточните свои требования, возможно, будет возможно найти другое решение.

Кстати: если вы не возражаете против решения, содержащего серверный компонент: вы можете заставить свой сервер компилировать новые SWF-файлы, содержащие правильный класс, и загружать их. Есть несколько способов заставить компилятор flex компилировать данные по запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...