Переход состояний при удалении элементов - PullRequest
0 голосов
/ 11 мая 2010

Я хотел бы написать переход, в котором все элементы из 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 элементы были повернуты.
Q2: существует ли такая вещь, как "autoReverse" для анимации?

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

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Вместо двух переходов вы можете добавить фильтр «удалить», чтобы изолировать эффект только для удаляемых элементов, и использовать 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

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

0 голосов
/ 11 мая 2010

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

<?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>

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

...