PDA

Просмотр полной версии : добавить эффект с помощью AS


kutuzov
21.02.2008, 12:30
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
private function onSelectedView(e:Event):void{
WipeU.end();
WipeD.end();
MoveF.end();
var index:int = main.getChildIndex(e.target as DisplayObject);
var mc:DisplayObject = this["box"+e.target.id];
if (e.currentTarget.selected) {
main.addChildAt(mc, index+1);
} else {
main.removeChild(mc);
}
}
]]>
</mx:Script>

<mx:WipeDown id="WipeD"/>
<mx:WipeUp id="WipeU"/>
<mx:Move id="MoveF"/>

<mx:VBox id="main" width="100%" height="100%" verticalGap="0">
<mx:CheckBox id="Peoples" label="qwe" selected="true" click="onSelectedView(event)"/>
<mx:VBox id="boxPeoples" paddingLeft="20" verticalGap="0" addedEffect="{WipeD}" removedEffect="{WipeU}">
<mx:CheckBox label="qwe1"/>
<mx:CheckBox label="qwe2"/>
<mx:CheckBox label="qwe3"/>
</mx:VBox>
<mx:CheckBox label="Projects" moveEffect="{MoveF}"/>
<mx:VBox id="boxProjects" paddingLeft="20" verticalGap="0" moveEffect="{MoveF}" addedEffect="{WipeD}" removedEffect="{WipeU}">
<mx:CheckBox label="asd1"/>
<mx:CheckBox label="asd2"/>
<mx:CheckBox label="asd3"/>
</mx:VBox>
</mx:VBox>
</mx:Application>
пример необходимо выполнить в as коде, сделал все кроме эффектов.

вопросы:
- как реализовать addedEffect="{WipeD}", разумеется что с помощью addEventListener(Event.ADDED, ...), но если создавать эффекты динамически то мне не понятно как к ним обратиться, именно к тому который записан на данный vbox, так как параметра name у WideDown и других нету;
- если писать программно то при removed, flex полностью удаляет vbox, и вернуть его уже нельзя, а если писать в mxml то можно. Это нужно для того чтоб нижние пункты поднимались вверх, если есть другой способ - сообщите.

может я не там копаю?
может есть простой способ типа WipeD.addTarget(boxPeoples), но тогда не ясно как добавить такой эффект именно на ADDED ?

baron27
21.02.2008, 14:06
А вот так может быть легче?

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private function onSelectedView(e:Event):void
{
WipeU.end();
WipeD.end();
MoveF.end();
boxPeoples.visible=Peoples.selected;
boxPeoples.includeInLayout=Peoples.selected;
}
]]>
</mx:Script>

<mx:WipeDown id="WipeD"/>
<mx:WipeUp id="WipeU"/>
<mx:Move id="MoveF"/>

<mx:VBox id="main" width="100%" height="100%" verticalGap="0">
<mx:CheckBox id="Peoples" label="qwe" selected="true" click="onSelectedView(event)"/>
<mx:VBox id="boxPeoples" paddingLeft="20" verticalGap="0" showEffect="{WipeD}" hideEffect="{WipeU}">
<mx:CheckBox label="qwe1"/>
<mx:CheckBox label="qwe2"/>
<mx:CheckBox label="qwe3"/>
</mx:VBox>
<mx:CheckBox label="Projects" moveEffect="{MoveF}"/>
<mx:VBox id="boxProjects" paddingLeft="20" verticalGap="0" moveEffect="{MoveF}" addedEffect="{WipeD}" removedEffect="{WipeU}">
<mx:CheckBox label="asd1"/>
<mx:CheckBox label="asd2"/>
<mx:CheckBox label="asd3"/>
</mx:VBox>
</mx:VBox>
</mx:Application>

ну а добавлять эффекты скриптом можно как-то так:

private var wipeD:WipeDown;
private var wipeU:WipeUp;
private var moveF:Move;

private function onCreationComplete():void
{
Peoples.addEventListener(Event.ADDED, onAddedEvent);
}

private function onAddedEvent(e:Evetn):void
{
wipeD = new WipeDown();
//инициализируем эффект
wipeD.play();
}

kutuzov
24.02.2008, 18:13
Здесь конечно не делаю эффект программно, как гласит тема, но чтоб перевести эффект в AS надо сначала так разобраться

Делаю простой эффект мигающей надписи с fade эффектом (для тестирования вставить свой шрифт)
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
<mx:Script>
<![CDATA[
[Embed("assets/AmericanRetro.ttf", fontName="AmericanRetro")]
public var font:Class;

private function init():void{
title.visible = true;
}
]]>
</mx:Script>

<mx:Fade id="fadeIn" alphaTo="1"/>
<mx:Fade id="fadeOut" alphaTo="0"/>

<mx:Label id="title" text="asd" visible="false" fontFamily="AmericanRetro" fontSize="40"
showEffect="{fadeIn}" hideEffect="{fadeOut}"
effectEnd="title.visible = !title.visible"/>
</mx:Application>
Эффект происходит следующим образом:
1. появляется от 0 до 1
2. исчезает от 1 до 0
3. появляется со значением 1
4. появляется от 0 до 1
... и т.д.

Необходимо избавиться от пункта 3.

Придумал как исправить, но это не есть правильно
effectEnd="callLater(function():void{title.visible = !title.visible})"