![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Oct 2003
Сообщений: 74
|
Второй день безуспешно рою документацию по Flex2 и AS3, чтобы решить следующую задачу. В разделе "Lessons" help'а есть пример "Use View States and Transitions". Этот пример показывает, как анимировать переход из одного состояние (state) программы в другое (из base в Advanced). При переходе в Advanced анимируется появление на экране дополнительных элементов интерфейса. Это делается с помощью создания Transition: <mx:Transition id="myTransition" fromState="*" toState="Advanced">.
В качестве задачки для освоения Flex я решила при обратном переходе (из Advanced в base) точно также анимированно спрятять появившиеся дополнительные элементы. Решить задачу c помощью создания еще одной Transition не удалось - как я понимаю, при переходе от одного состояния к другому смена состояния осуществляется в первую очередь - и только потом выполняются прописанные в Transition действия. Видимо, в состоянии Advanced нужно заменить в <mx:SetEventHandler target="{linkbutton1}" name="click" handler="currentState=''"/> параметр handler с "currentState=''" на вызов процедуры, которая сначала анимированно уберет с экрана "лишние" элементы интерфейса, и лишь затем поменяет currentState на base. Если я правильно понимаю, для этого можно попробовать использовать следующую конструкцию: <mx:Script>
<![CDATA[
public function changeStateFromAdvancedToBase():void {
???
}
]]>
</mx:Script>
<mx:State name="Advanced">
...
<mx:SetEventHandler target="{linkbutton1}" name="click" handler="changeStateFromAdvancedToBase()"/>
</mx:State>
Вопрос 1: В MXML я могла бы задать анимированное исчезновение, например, так: <mx:Parallel target="{myVBox}">
<mx:WipeUp duration="2000"/>
<mx:Dissolve alphaFrom="1.0" alphaTo="0.0" duration="2000"/>
</mx:Parallel>
Вопрос 2: Как в AS3 заставить программу перейти в новое состояние? В help'е описан класс State - но в его описании я не нашла способа сделать конкретный State текущим. В классе Application я также не нашла ни способа найти возможные State'ы Application'а, ни способа определить или поменять currentState. |
|
|||||
|
Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
|
по поводу эффектов перехода:
пишешь var p : Parallel = new Parallel(myVBox); var wipeUpEffect : WipeUp = new WipeUp(); wipeUpEffect.duration = 2000; var dissolveEffect : Dissolve = new Dissolve(); dissolveEffect.alphaFrom = 1; dissolveEffect.alphaTo = 0; ... p.addChild(wipeUpEffect); p.addChild(dissolveEffect); ![]() по поводу currentState: просто пишешь так должно работать. |
|
|||||
|
Регистрация: Oct 2003
Сообщений: 74
|
Вставила следующий скрипт:
<mx:Script><![CDATA[
import mx.effects.*;
var wipeUpEffect : WipeUp = new WipeUp();
wipeUpEffect.duration = 2000; // Error
var dissolveEffect : Dissolve = new Dissolve();
dissolveEffect.alphaFrom = 1; // Error
dissolveEffect.alphaTo = 0; // Error
var p : Parallel = new Parallel(myVBox);
p.addChild(wipeUpEffect); // Error
p.addChild(dissolveEffect); // Error
public function changeStateFromAdvancedToBase():void {
p.play();
}
]]></mx:Script>
Попробовала "убрать" эти строки в функцию: public function myMain():void {
var wipeUpEffect : WipeUp = new WipeUp();
...
p.addChild(dissolveEffect);
}
p.play(); // Error: Access of undefined property p. Я с 1999 работаю со флэшом, с 2001 с java - но идеологию Flex'а пока никак не прочувствую ![]() |
|
|||||
|
Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
|
ну естественно, что были ошибки...
var variable : Type - это объявление локальной переменной (внутри метода, например - как ты и сделала потом). А теперь у тебя ошибка, потому что в changeStateFromAdvancedToBase переменная p не определена. Вынеси объявление переменных из методов, только не забудь приписать им модификатор - private, public... |
|
|||||
|
Регистрация: Oct 2003
Сообщений: 74
|
Спасибо за помощь! Через полчаса проб и ошибок все заработало
![]() На всякий случай, приведу решение собственной задачки - может, это поможет кому-то из коллег по освоению Flex'а. Итак, чтобы в стандартном примере ViewStates (Help -> Help Contents -> Getting Started with Flex2 -> Lessons -> Use View States and Transitions), эффект проявления дополнительных опций работал бы не только при переходе из базового состояния в Advanced, но и при обратном переходе из Advanced в базовое дополнительные опции исчезали, делаем следующее: Меняем EventHandler: <mx:State name="Advanced">
...
<mx:SetEventHandler target="{linkbutton1}" name="click" handler="changeStateFromAdvancedToBase(myVBox)"/> // Изменяемая строка
</mx:State>
</mx:Panel>
// Начало добавляемого фрагмента
<mx:Script><![CDATA[
import mx.effects.*;
import mx.events.*;
static public var wipeDownEffect : WipeDown = new WipeDown();
wipeDownEffect.duration = 2000;
static public var dissolveEffect : Dissolve = new Dissolve();
dissolveEffect.alphaFrom = 0;
dissolveEffect.alphaTo = 1;
dissolveEffect.duration = 2000;
static public var p : Parallel = new Parallel();
p.addChild(wipeDownEffect);
p.addChild(dissolveEffect);
static private function changeStateFromAdvancedToBase_Listener(evt:Event):void {
Application.application.currentState = "";
}
p.addEventListener(mx.events.EffectEvent.EFFECT_END,changeStateFromAdvancedToBase_Listener);
public function changeStateFromAdvancedToBase(target : Object):void {
p.play([target],true);
}
]]></mx:Script>
// Конец добавляемого фрагмента
</mx:Application>
|
![]() |
![]() |
Часовой пояс GMT +4, время: 03:08. |
|
|
« Предыдущая тема | Следующая тема » |
|
|