У меня есть компонент 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 независимо от того, изменения состояния).