Переход состояний при удалении элементов

Я хотел бы написать переход, в котором все элементы из State1 вращаются вокруг оси Y, а затем отображают элементы из State2. Это показано в фиктивном коде ниже (просто представьте, что Label 1 — это группа).

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx">
 <s:states>
  <s:State name="State1"/>
  <s:State name="State2"/>
 </s:states>
 <s:transitions>
  <s:Transition fromState="*" toState="State2" autoReverse="true">
   <s:Rotate3D target="{label2}" angleYFrom="-90" angleYTo="0" autoCenterTransform="true" duration="1000"/>
  </s:Transition>
 </s:transitions>
 <fx:Declarations>
  <s:Rotate3D id="phaseOut" target="{label1}" angleYFrom="0" angleYTo="90" autoCenterTransform="true" duration="1000" effectEnd="currentState='State2'" />
 </fx:Declarations>
 <s:Label id="label1" includeIn="State1" text="This is state 1" horizontalCenter="0" verticalCenter="0"/>
 <s:Label id="label2" includeIn="State2" text="This is state 2" horizontalCenter="0" verticalCenter="0"/>
 <s:Button label="Change" horizontalCenter="0" verticalCenter="30" click.State1="phaseOut.play()" click.State2="currentState='State1'"/>
</s:WindowedApplication>

Моя первая проблема заключается в том, что когда вызывается переход состояния, все элементы из State1 уже исчезли, поэтому мне приходится разделить переход на два хака (см. «PhaseOut»). Это кажется очень плохим, поскольку я по существу переписываю механизм перехода.
Q1: Существует ли "чистый" способ перехода к элементам, не принадлежащим State2?

Вторая проблема заключается в том, что при возврате к состоянию 1 элементы были повернуты.
В2. Существует ли такая вещь, как "автореверс" для анимации?

Спасибо за ваше время!


person MonoThreaded    schedule 11.05.2010    source источник


Ответы (2)


Вместо двух переходов вы можете добавить фильтр «удалить», чтобы изолировать эффект только для удаляемых элементов, и использовать действие RemoveChildAction, чтобы сообщить переходу, когда выполнять действие для удаления элементов.

Информация о RemoveChildAction:

http://livedocs.adobe.com/flex/3/langref/mx/effects/RemoveChildAction.html

Информация о фильтрах: http://livedocs.adobe.com/flex/3/langref/mx/effects/Effect.html#filter

Эффекты имеют обратный метод воспроизведения в обратном порядке: http://livedocs.adobe.com/flex/3/langref/mx/effects/Effect.html#reverse%28%29

Хотя я слышал от людей неоднозначные отзывы о том, насколько это успешно.

person JeffryHouser    schedule 11.05.2010

Использование стеков просмотра, похоже, хорошо помогает:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" >
    <fx:Declarations>
        <s:Rotate3D id="phaseOut" angleYFrom="0" angleYTo="90" duration="500" autoCenterTransform="true" />
        <s:Rotate3D id="phaseIn" angleYFrom="-90" angleYTo="0" duration="500" autoCenterTransform="true" startDelay="500" />
    </fx:Declarations>
    <mx:ViewStack id="viewstack1" width="200" height="200" horizontalCenter="0" verticalCenter="0">
        <s:NavigatorContent label="View 1" width="100%" height="100%" hideEffect="{phaseOut}" showEffect="{phaseIn}" >
            <s:Label id="label1" text="This is state 1" horizontalCenter="0" verticalCenter="0"/>
        </s:NavigatorContent>
        <s:NavigatorContent label="View 2" width="100%" height="100%"  hideEffect="{phaseOut}" showEffect="{phaseIn}">
            <s:Label id="label2" text="This is state 2" horizontalCenter="0" verticalCenter="0"/>
        </s:NavigatorContent>
    </mx:ViewStack>
    <s:Button label="Toggle" click="viewstack1.selectedIndex=(viewstack1.selectedIndex==0?1:0)"  horizontalCenter="0" top="10"/>
</s:Application>

Код аккуратный, а эффект именно такой, как и ожидалось.

person MonoThreaded    schedule 11.05.2010