Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   States и transitions - пару вопросов (http://www.flasher.ru/forum/showthread.php?t=170571)

Dimitry_II 27.10.2011 17:48

States и transitions - пару вопросов
 
Есть приложение:
Код:

<s:Application ...>
    <fx:Script>
        <![CDATA[
        ...
        currentState = "state1";
        ....
        ]]>
    </fx:Script>
    <someContainer>
        <project.views:View1 id="view1" includeIn="state1"/>
        <project.views:View2 id="view2" includeIn="state2"/>
    </someContainer>
    <s:states>
        <s:State name="state1"/>
        <s:State name="state2"/>
    </s:states>
</s:Application>

Если в View1 я хочу перейти в View2, то приходится делать следующее (часть View1):
Код:

    ...
    <s:Button label="toView2" click="FlexGlobals.topLevelApplication.currentState = 'state2'"/>
    ...

Что-то терзают меня смутные сомнения, что я что-то делаю не так. Так как все работает как хотелось бы, то это всего лишь подозрения. Я так понимаю, что правильнее было диспатчить события выше по структуре для изменения состояния. Но как быть, если мне надо сделать разделение сотояния не на самом верхнем уровне, а в одном из "окон" (представлении)? - Ведь состояния - привилегия приложения (верхнего уровня).

И второй вопрос - относительно переходов между состояниями. Доки в инете по transitions навалом, но ответ на свой вопрос я нашел только в искаженном виде.
Допустим, я хочу, чтобы приложение из состояния state1 в состояние state2 переходило путем "исчезания" элементов первого и "появления" второго. Если сделать банально
Код:

<s:Transition fromState="state1" toState="state2">
    <s:Fade target="{view1}" alphaFrom="1" alphaTo="0" duration="600"/>
    <s:Fade target="{view2}" alphaFrom="0" alphaTo="1" duration="600"/>
</s:Transition>

(неважно, что мы будет использовать - Sequence, Parallel или другое), мы не увидим действий над элементами из состояния "fromState" - только из "toState".
Решение извращенное:
Код:

<s:State name="state1Tostate2"/>
...
<s:Transition fromState="state1" toState="state1Tostate2">
    <s:Fade target="{view1}" alphaFrom="1" alphaTo="0" effectEnd="currentState = 'state2'"/>
</s:Transition>
<s:Transition fromState="*" toState="state2">
    <s:Fade target="{view2}" alphaFrom="0" alphaTo="1"/>
</s:Transition>

Будь в приложении пару окон, проблем бы не было - можно и поизвращаться. А если окон очень много, как быть? Что-то не могу пока придумать какого-то автоматизированного способа по смене состояний.

Буду признателен за советы в отношении этих двух вопросов.

djyamato 27.10.2011 18:21

"Ведь состояния - привилегия приложения (верхнего уровня)."
С чего это вдруг ?
Любой компонент может иметь стэйты, скажу даже более, компоненты их имеют :) Как минимум : "normal", "disabled".
А так, придумывайте свои стэйты сколько Вам захочется http://help.adobe.com/en_US/flex/usi...3611-7ff2.html

P.S. s:Application тоже компонент

Genzo 27.10.2011 19:15

попробуйте использовать
Код AS3:

<mx:ViewStack>


Dimitry_II 27.10.2011 23:32

Да не, ViewStack я отбросил сразу - неудобно.

И что-то со стейтами погорячился - все значительно проще. Спасибо за наводку. Действительно, для каждой подчиненной структуры создаю свои стейты и обрабатываю переходы. Ничего сложного. Единственное - приходится назначать стартовый стейт для подчиненной структуры при переходе на нее, а также наоборот - возврат приходится осуществлять через назначение стейта родителя из потомка.

Переходы также оказались не такими страшными. Возможет такой вариант
Код:

<s:Transition fromState="state1" toState="state2" autoReverse="true">
    <s:Fade targets="{[view1, view2]}" duration="800"/>
</s:Transition>

Но, к сожалению, такой вариант работает только один цикл - "туда" и "обратно". Повторной работы не добился и вернулся к варианту
Код:

<s:Transition fromState="state1" toState="state2">
    <s:Fade targets="{[view1, view2]}" duration="800"/>
</s:Transition>
<s:Transition fromState="state2" toState="state1">
    <s:Fade targets="{[view2, view1]}" duration="800"/>
</s:Transition>

По крайней мере, не нужно вводить транзитные состояния, что уже проще и понятнее.


Часовой пояс GMT +4, время: 10:56.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.