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

DisplayObjectContainer.removeAllChildren()

среда, март 19, 2008

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

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

  1. public function removeAllChildren():void
  2. {
    1. while (numChildren > 0)
      1. removeChildAt(0);
  3. }

flash.debugger.enterDebugger()

четверг, март 13, 2008
  1. import flash.debugger.enterDebugger;
  2. enterDebugger();

Попробуйте во время деббага :)
Поведение такое-же как при breakpoint.

Благодарю Ростика за информацию!

Как понять, что событие произошло именно на подписчике?

вторник, март 11, 2008

Иногда нам нужно знать произошло ли событие на подписчике или пришло вследствие bubbling. Например, нам нужно отследить нажатие мыши на stage, но нам точно нужно знать что пользователь кликнул именно на stage, а не на его child. Мы конечно можем сделать

stage.mouseChildren = false;

но это чаще всего не подходит.

Можно поступить двумя равносильными способами.

В обработчике для stage выполняем проверку на равенство event.target с event.currentTarget:

  1. function stageClickHandler(event:MouseEvent):void
  2. {
    1. if(event.target != event.currentTarget)
      1. return;
    1. // Your code here
  3. }

Или проверим какая фаза event flow. Если она равна 2 (target phase), то событие произошло именно на stage. В ином случае, прекращаем выполнение обработчика:

  1. function stageClickHandler(event:MouseEvent):void
  2. {
    1. if(event.eventPhase != 2)
      1. return;
    1. // Your code here
  3. }

Подробнее про событийную модель в ActionScript 3.0 Вы можете почитать в докладе Константина Ковалёва.

[MXML] Как сделать setter, который принимает числовое значение и значение в процентах?

понедельник, март 10, 2008

Вы никогда не задумывались как может setter (в mxml), например width, который принимает Number, может принимать значения вида ‘50%’?

А всё очень просто :) Существует метатег [PercentProxy], который как параметр принимает имя метода, который будет задействован, если значение будет задано в процентах.

Пример. Созданим класс FleasCatcher:

  1. package
  2. {
    1. import mx.containers.Canvas;
    1. public class FleasCatcher extends Canvas
    1. {
      1. [PercentProxy(”percentFleasCountInMyHead“)]
      1. public function set fleasCountInMyHead(value:Number):void
      1. {
        1. trace(”number: “+value);
      1. }
      1. public function set percentFleasCountInMyHead(value:Number):void
      1. {
        1. trace(”percent: “+value);
      1. }
    1. }
  3. }

Теперь мы можем написать так:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” xmlns:local=”*”>
    1. <local:FleasCatcher fleasCountInMyHead=”1000” />
  3. </mx:Application>

Или так:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” xmlns:local=”*”>
    1. <local:FleasCatcher fleasCountInMyHead=”99%” />
  3. </mx:Application>

Напильник для Flex: mx_internal

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

Адобовцы довольно часто используют namespace mx_internal для внутреннего общения между компонентами. Но и нам, иногда, полезно поиспользовать этот namespace. Например, нам нужно в Button.label отобразить html-текст.

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”vertical”>
    1. <mx:Button id=”helloB” label=”Hello World!”/>
    1. <mx:creationComplete>
      1. <![CDATA[
      1. helloB.getTextField().htmlText = “<u><i>H</i>ello World!</u>”;
      1. // если бы мы не применили бы namespace то можно было бы написать так:
      1. // helloB.mx_internal::getTextField().htmlText = “<u><i>H</i>ello World!</u>”;
      1. ]]>
    1. </mx:creationComplete>
    1. <mx:Script>
      1. <![CDATA[
      2. import mx.core.mx_internal; // импотируем namespace
      1. use namespace mx_internal; // применяем его
      1. ]]>
    1. </mx:Script>
  3. </mx:Application>

Но это нужно использовать крайне осторожно, т.к. очень легко поламать компонентину (т.к. запуск подобного метода выбивается из цикла жизни компонента) или просто при следующем обновлении компонент просто переопределит то, что Вы задали в значение, которое было до использования метода.