[AIR] NativeMenu + SystemTrayIcon – MouseEvent.RIGHT_CLICK = та що з маком

Tuesday, April 15, 2008

Так, в AIR є можливість використовувати своє контекстне меню, додавати вкладені меню і т.д. Ми можемо навіть відображати його, коли нам завгодно, а не тільки по правому кліку. Для цього у класу NativeMenu є метод:

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

Все було б добре, але є одне але :(

Як Ви бачите метод display() приймає першим параметром Stage, але у SystemTrayIcon немає stage :( Тобто, якщо нам потрібно відобразити меню біля трею (за допомогою display()), то треба використовувати Application.application.stage, але тоді треба бути поміркувати як розташувати меню :) Адже координати SystemTrayIcon невідомі…

Метагеґ [MIXIN] у Flex

Thursday, March 27, 2008

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

	public static function init(root:DisplayObject):void

Викличе її SystemManager.

У допомозі Flex є згадки про цей метатеґ, знайти їх можна виконавши пошук по слову mixin :)

Як за допомогою [embed] вбудувати swf з кодом

Friday, March 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

Thursday, March 20, 2008

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

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

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

DisplayObjectContainer.removeAllChildren()

Wednesday, March 19, 2008

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

Ось, на мою думку, найелегантніша реалізація (підказали Адобовці):

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