Архів для категорії ‘Flex Builder 3’

Flex Builder иногда “не видит” класс

, 15, 2008

Если условием оператора if является результат функции, и тело оператора начинается со скобки “(“, то Flex Builder не подскажет имя класса в котором есть подобный if.

Вот пример:

  1. package
    1. {
    1. public class Flea
    2. {
      1. public function Flea()
      2. {
        1. if(this.hasOwnProperty(“startJump”))
          1. (this as Object).startJump()
      3. }
    3. }
  2. }

В другом классе того же проекта при нажатии Ctrl+Space мы не увидим класс Flea.

1.gif

Также в самом классе не будут работать большинство возможностей Flex Builder, как например переход по F3, или Ctrl+o.

Такого не случиться, если использовать фигурные скобки для обрамления тела оператора if :)

  1. if(this.hasOwnProperty(“startJump”))
  2. {
    1. (this as Object).startJump()
  3. }

Результат:

2.gif

getter/setter + (increment || decrement) = жук в компиляторе

, 30, 2008

Имеем переменную заданную с помощью get и set функций:

  1. var _num:Number = 0;
  2. function get num():Number
  3. {
    1. return _num;
  4. }
  5. function set num(value:Number):void
  6. {
    1. _num = value;
  7. }

Создаём ещё одну переменную:

var num2:Number = num++;

Получаем ошибку компиляции:

1067: Implicit coercion of a value of type void to an unrelated type Number.

Думаю получается вот так:

var num2:Number = set num(get num() +1);

А так как результат set num() равен void, то мы и получаем ошибку.

<mx:Binding />

, 28, 2008

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

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
	<mx:TextInput text="{textInputText}" />
	<mx:String id="textInputText" />
</mx:Canvas>

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

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
	<mx:TextInput id="ti" text="{textInputText}" />
	<mx:String id="textInputText" />
	<mx:Binding source="ti.text" destination="textInputText" />
</mx:Canvas>

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

Обновление:

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

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
	<mx:TextInput id="ti" text="{textInputText}" />
	<mx:String id="textInputText">{ti.text}</mx:String>
</mx:Canvas>

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

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

, 27, 2008

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

	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-проекте:

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

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

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

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

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

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

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

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

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

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

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

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