[AIR] NativeMenu + SystemTrayIcon – MouseEvent.RIGHT_CLICK = БОЛТ

, 15, 2008

Да, в AIR можно использовать своё контекстное меню, добавлять подменю и т.д. Мы даже можем вызвать его, когда захочем, а не только по правому клику. Для этого у класса NativeMenu есть метод:

	NativeMenu.display(stage:Stage, stageX:Number, stageY:Number):void

Всё бы хорошо, но есть одно но :(

Как Вы видите метод display() принимает первым параметром Stage, но у SystemTrayIcon нет stage :( Т.е. если нам нужно отобразить меню возле трея (с помощью display()), то нужно использовать Application.application.stage, но тогда нам нужно будет поразмыслить как спозиционировать меню :) Ведь координаты SystemTrayIcon неизвестны…

Метагег [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.

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

[SWF] metatag

, 20, 2008

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

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

>

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

DisplayObjectContainer.removeAllChildren()

, 19, 2008

Я практически уверен, что Вы хоть раз искали метод removeAllChildren() в DisplayObjectContainer :)

Вот, по-моему, самая элегантная реализация (подсказали Адобовцы):

public function removeAllChildren():void
{
	while (numChildren > 0)
		removeChildAt(0);
}