Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.12.2006, 13:26
yana_flash вне форума Посмотреть профиль Отправить личное сообщение для yana_flash Найти все сообщения от yana_flash
  № 1  
Ответить с цитированием
yana_flash

Регистрация: Oct 2003
Сообщений: 74
По умолчанию Изменение State из ActionScript'а

Второй день безуспешно рою документацию по 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>
Как реализовать аналогичное действо из AS3?

Вопрос 2:
Как в AS3 заставить программу перейти в новое состояние? В help'е описан класс State - но в его описании я не нашла способа сделать конкретный State текущим. В классе Application я также не нашла ни способа найти возможные State'ы Application'а, ни способа определить или поменять currentState.

Старый 08.12.2006, 15:12
fishbounce вне форума Посмотреть профиль Отправить личное сообщение для fishbounce Посетить домашнюю страницу fishbounce Найти все сообщения от fishbounce
  № 2  
Ответить с цитированием
fishbounce

Регистрация: 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);
Вроде так... и не думаю, что в help'e этого нету

по поводу currentState:
просто пишешь
Код:
yourComponent.currentState = "nameOfState";
так должно работать.

Старый 08.12.2006, 17:41
yana_flash вне форума Посмотреть профиль Отправить личное сообщение для yana_flash Найти все сообщения от yana_flash
  № 3  
Ответить с цитированием
yana_flash

Регистрация: 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>
В результате в 5 местах Flex говорит об ошибке: "Access of undefined property...", говоря, что ни p, ни wipeUpEffect, ни dissolveEffect не определены.

Попробовала "убрать" эти строки в функцию:
Код:
public function myMain():void {
  var wipeUpEffect : WipeUp = new WipeUp();
...
  p.addChild(dissolveEffect);
}
В результате эти 5 ошибок исчезли, зато появилась ошибка в единственной строке функции changeStateFromAdvancedToBase():
p.play(); // Error: Access of undefined property p.

Я с 1999 работаю со флэшом, с 2001 с java - но идеологию Flex'а пока никак не прочувствую

Старый 09.12.2006, 00:41
fishbounce вне форума Посмотреть профиль Отправить личное сообщение для fishbounce Посетить домашнюю страницу fishbounce Найти все сообщения от fishbounce
  № 4  
Ответить с цитированием
fishbounce

Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
ну естественно, что были ошибки...
var variable : Type - это объявление локальной переменной (внутри метода, например - как ты и сделала потом).
А теперь у тебя ошибка, потому что в changeStateFromAdvancedToBase переменная p не определена.
Вынеси объявление переменных из методов, только не забудь приписать им модификатор - private, public...

Старый 11.12.2006, 15:48
yana_flash вне форума Посмотреть профиль Отправить личное сообщение для yana_flash Найти все сообщения от yana_flash
  № 5  
Ответить с цитированием
yana_flash

Регистрация: 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>
В конец исходного кода добавляем AS3-скрипт:

Код:
	</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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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