Архів для категорії ‘Полезные блохи’

<mx:Binding />

среда, май 28, 2008

Довольно часто мы создаём глобальную переменную (в рамках mxml-компонента), которая связывается (binding) с переменной внутреннего компонента:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Canvas xmlns:mx=”http://www.adobe.com/2006/mxml” width=”400″ height=”300″>
    1. <mx:TextInput text=”{textInputText}” />
    2. <mx:String id=”textInputText” />
  3. </mx:Canvas>

Но при этом связывание одностороннее, т.е. в приведённом примере, если пользователь введёт текст в поле, то переменная textInputText не измениться. На помощь приходит тег <Binding>.

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Canvas xmlns:mx=”http://www.adobe.com/2006/mxml” width=”400″ height=”300″>
    1. <mx:TextInput id=”ti” text=”{textInputText}” />
    2. <mx:String id=”textInputText” />
    3. <mx:Binding source=”ti.text” destination=”textInputText” />
  3. </mx:Canvas>

Единственный минус в том, что нужно придумывать id для TextInput :)

Обновление:

Оказывается можно сделать проще :)

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Canvas xmlns:mx=”http://www.adobe.com/2006/mxml” width=”400″ height=”300″>
    1. <mx:TextInput id=”ti” text=”{textInputText}” />
    2. <mx:String id=”textInputText”>{ti.text}</mx:String>
  3. </mx:Canvas>

Это не избавляет нас от придумывания id, но бережёт одну строчку кода. А <binding> можно использовать для связывания к больше чем одному объекту.

flash.trace.Trace

понедельник, май 26, 2008

Да, есть такой класс, очень не приметный, но может быть очень полезным :)

Он делает отличную штуку :). После “запуска” выдаёт в output имена ВСЕХ! методов, которые запускаются с именами классов к которым они принадлежат. Класс не документирован, т.е. как с ним работать я не знаю (google тоже ничего не говорит), но методов проб и ошибок что-то удалось выяснить.

Вот все его методы (класс статический, т.е. все методы - статические):

  • Trace.setLevel(l:int, target:int=2):Object
  • Trace.getLevel(target:int=2):int
  • Trace.setListener(f:Function):Object
  • Trace.getListener():Function;

Trace.setLevel(l:int, target:int=2):Object

Устанавливает уровень вещания и цель вещания.

Первым параметром может быть одна из констант:

  • Trace.METHODS_AND_LINES_WITH_ARGS = 4
    • Название метода с входными параметрами и номер строки в коде с путём к класс, в котором был запущен метод
  • Trace.METHODS_AND_LINES = 3
    • Название метода и номер строки
  • Trace.METHODS_WITH_ARGS = 2
    • Название метода с входными параметрами
  • Trace.METHODS = 1
    • Только название метода
  • Trace.OFF = 0
    • Выключено

Вторым параметром может быть:

  • Trace.LISTENER = 2
    • Вещать в функцию, заданную с помощью setListener().
  • Trace.FILE = 1
    • Вещать в output.

Trace.getLevel(target:int=2):int

Возвращает уровень вещания для цели.

Trace.setListener(f:Function):Object

Устанавливает функцию-листенер при цели вещания = Trace.LISTENER.

Функция должна принимать 4 параметра:

  1. private function traceListener(
    1. fileInfo:String,
    2. lineNumber:String,
    3. classAndMethod:String,
    4. methodArguments:String
  2. ):void

fileInfo - папка, где находится файл + “;” + что-то ещё (у меня была пустая строка) :) + “;” + имя файла.

Пример: “D:\Projects\ForTestsF3\src;;ForTestsF3.mxml”

lineNumber - номер строчки

classAndMethod - полное имя класса + (”/” || “$/” ) + имя метода.

Примеры: “flash.display::DisplayObjectContainer/addChild”

“flash.trace::Trace$/setListener” - “$/” используется, если метод статичный

methodArguments -входные параметры метода, разделённые запятой (,). Но если параметры заданы с помощью rest оператора (…), то они показаны не будут.

Trace.getListener():Function

Возвращает, заданную раньше, функцию-листенер.

Вот пример:

  1. import flash.trace.Trace;
  2. function test(t:String):String
  3. {
    1. return t;
  4. }
  5. Trace.setLevel(Trace.METHODS_WITH_ARGS, Trace.FILE);
  6. var st:String = “hello!”;
  7. test(st);
  8. stop();

В output увидите:

  1. 14554003 AVMINF: MTHD Untitled_fla::MainTimeline/test (”hello!”) @ 0×042F0300
  2. 4554004 AVMINF: MTHD flash.display::MovieClip/stop () @ 0×0EF004D0

Огромное спасибо 7thsky за помощь!

Метагег [MIXIN] во Flex

четверг, март 27, 2008

Если Вы вставите метатег [MIXIN] в Вашем классе (чуть выше определения класса), то при старте Flex-аппликухи будет запущена статическая функция init():

  1. public static function init(root:DisplayObject):void

А запустит её SystemManager.

В помощи Flex есть упоминания про этот метатег, найти их можна выполнив поиск по слову mixin :)

Как с помощью [embed] встроить swf с кодом

пятница, март 21, 2008

Мы знаем, что при встраивании swf с помощью тега [Embed] весь код, который был в swf-ке, утрачивается. Есть один способ как уберечь код.

Сначала создадим во Flash IDE флэшку, главным классом которой будет, например, assets.Flea. В этом классе сделаем метод startJumping(), который просто будет начинать проигрывание флэшки. Файл назовём flea.swf.

Теперь встроим flea.swf в какой-нибудь класс во Flex-проекте:

  1. [Embed(”assets/flea.swf”, mimeType=”application/octet-stream”)]
  2. private var FleaAsset:Class;

mimeType=”application/octet-stream” даёт понять компилятору Flex, что встраивание нужно проводит без никаких конвертаций.

Теперь во FleaAsset мы имеем класс ByteArrayAsset, т.е., практически ByteArray.

Далее загружаем экземпляр FleaAsset в Loader с помощью loadBytes():

  1. var currLoader:Loader = new Loader();
  2. var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
  3. currLoader.loadBytes( new FleaAsset(), ldrContext );

ldrContext мы используем, что бы быть уверенными, что класс, который находиться в FleaAsset будет тем же самым, что и во Flex проекте.

Далее, что бы класс из FleaAsset появился для нашего использования нам нужно подождать один кадр. Это не очень хорошо, но как это обойти я не знаю.

  1. var sprite:Sprite = new Sprite();
  2. sprite.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

Далее, мы просто создаём экземпляр класса assets.Flea и используем его как хотим. Вся графическая часть, созданная во Flash IDE останется :)

  1. import assets.Flea;
  2. function enterFrameHandler(event:Event):void
  3. {
    1. var flea:Flea = new Flea();
    1. addChild(flea);
    1. flea.startJumping();
    2. sprite.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
  4. }

Я сделал пример библиотечки, которая может упростить работу с встроенными swf.

Что бы узнать больше, рекомендую почитать ещё следующее (на английском):

SWF metatag

четверг, март 20, 2008

В ActionScript проекте (имеется в виду проект во Flex Builder) параметры swf файла Вы можете задать с помощью метатега SWF:

[SWF(width="800", height="600", frameRate="30", backgroundColor="#FFFFFF")]

Поместите его перед определением главного класса.