Обнаружение, когда компонент Spark отображается или скрывается при изменении состояния

У меня есть компонент Spark, который запускает некоторые анимации, когда он виден (через таймер).

Компонент должен:

  • приостановить таймер, когда он скрыт и
  • возобновить таймер, когда он снова появится.

.

<!-- RandomButton.mxml-->
<?xml version="1.0"?>
<s:Button xmlns:fx="http://ns.adobe.com/mxml/2009"
          xmlns:s="library://ns.adobe.com/flex/spark"
          creationComplete="start()">
    <fx:Script><![CDATA[
        public var ticker:Timer = new Timer(1000, 0)

        private function start():void {
            ticker.addEventListener(TimerEvent.TIMER, function(e:TimerEvent):void {
                label = '' + Math.random()
            })
        }
    ]]></fx:Script>
</s:Button>

Вот как можно достичь цели с помощью enterState + exitState:

<!-- Main.mxml -->
<?xml version="1.0" ?>
<s:Application
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns="*">
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>

    <s:states>
        <s:State name="STATE_1"
                 enterState="b.ticker.start()"
                 exitState="b.ticker.stop()"/>
        <s:State name="STATE_2"/>
    </s:states>

    <s:Button label="STATE_1" click="currentState='STATE_1'"/>
    <s:Button label="STATE_2" click="currentState='STATE_2'"/>

    <RandomButton id="b" includeIn="STATE_1"/>
    <s:Label text="Debug: {b.label}"/>

</s:Application>

При нажатии кнопки STATE_2 таймер останавливается — вы можете видеть, что метка «отладка» также останавливается.

Вы можете видеть, что RandomButton нуждается в некоторой внешней «помощи», чтобы справиться со своими внутренними проблемами. Это означает копирование enterState/exitState в любое место, где будет использоваться RandomButton. Что просто грустно.

ВОПРОС

Я хочу, чтобы RandomButton сохранял свое состояние сам по себе. Нравится:

<!-- Main.mxml -->
...
    <s:states>
        <s:State name="STATE_1"/><!-- no need to poke inside the RandomButton -->
        <s:State name="STATE_2"/>
    </s:states>
...

<!-- RandomButton.mxml -->
<?xml version="1.0"?>
<s:Button xmlns:fx="http://ns.adobe.com/mxml/2009"
          xmlns:s="library://ns.adobe.com/flex/spark"
          creationComplete="start()"

          whenShown="ticker.start()"
          whenHidden="ticker.stop()" >
    ...
</s:Button>

Атрибуты whenShown и whenHidden не существуют. Это просто пожелания.

ПРИМЕЧАНИЕ. Существуют атрибуты show и hide, но они имеют дело со свойством visible (которое остается равным true независимо от того, изменения состояния).


person oshyshko    schedule 15.06.2011    source источник


Ответы (1)


Вот решение:

<!-- RandomButton.mxml -->
<?xml version="1.0"?>
<s:Button xmlns:fx="http://ns.adobe.com/mxml/2009"
          xmlns:s="library://ns.adobe.com/flex/spark"

          addedToStage="ticker.start()"
          removedFromStage="ticker.stop()"
    ...
</s:Button>
person Dmitry Stepanov    schedule 15.06.2011