使用GreenSock分隔移动补间和alpha补间

时间:2013-02-04 13:23:17

标签: actionscript-3 air tween flash-cs6 greensock

我在AS3中使用GreenSock的TweenMax,在iOS上使用Flash AIR 3.2。我正在尝试获取一串文本,以便在补间移动期间使用autoAlpha插件在某个点(例如在它到达补间的中间之后)开始淡入淡出,而不是从开始到结束。目前它正在补充两者从开始位置到完成的移动和alpha。这可能吗?

TweenMax.to(textOne, 14, {x:xScreenPos - 150, ease:SlowMo.ease.config(1, 0), repeat:-1, autoAlpha:0.5});

编辑:这是当前的代码,其功能和语法已修复,但由于某些原因它不起作用。仍有一个补间运动,但alpha不再补间了。但逻辑似乎是正确的。 (alpha现在替换autoAlpha,因为它适用于后者。)

import com.greensock.events.TweenEvent;
import com.greensock.TweenMax;

var _middle:Boolean = false;
var _tween:TweenMax;

public function run():void {
    _tween = TweenMax.to(textOne, 14, {x:xScreenPosEnd, ease:SlowMo.ease.config(1, 0), repeat:-1});
    _tween.addEventListener(TweenEvent.UPDATE, updateListener);
    _tween.addEventListener(TweenEvent.REPEAT, repeatListener);
}

function updateListener(e:TweenEvent):void {
    if(_tween.totalProgress() > 0.5 && _middle == false) {
        TweenMax.to(textOne, 7, {ease:SlowMo.ease.config(1, 0), repeat:-1, alpha:0});
        _middle = true;
    }
}

function repeatListener(e:TweenEvent):void {
    textOne.alpha = 1.0;
    _middle = false;
}

编辑:totalProgress()已被progress()和alpha补间替换 - 但是alpha补间还存在另一个问题。我已经跟踪textOne.alpha_tween.progress()进行调试。要么是因为AS3的单线程特性,它会在每个循环结束时搞乱调用逻辑...因为有一个延迟结束的alpha补间,REPEAT调用不能将alpha设置为1 ,在补间开始之前。或者它是逻辑中的错误。我尝试将TextOne的(alpha)补间时间设置为6,但它仍然会混淆它。

实际上,我不太确定在考虑它之后发生了什么。它没有逻辑意义。第一个alpha补间很好,然后它会重复并重复alpha补间(但在错误的进度()位置)几次,然后永远保持在0。这是跟踪的快照:

ALPHA:0.0078125
进展:0.9979285714285714
中:真的 ...
阿尔法:0
进展:0.9992857142857144
中:真的

ALPHA:0
进展:0.00028571428571438115
中:真的

ALPHA:0
进展:0.000714285714285826
中:虚假

ALPHA:0.99609375
进展:0.0015714285714287155
中:假
...
阿尔法:0.1015625
进展:0.4504285714285715
中:虚假

ALPHA:0.09765625
进展:0.4515714285714285
中:假
...
阿尔法:0.00390625
进展:0.4992142857142858
中:虚假

ALPHA:0
进展:0.5003571428571431
中:虚假

2 个答案:

答案 0 :(得分:1)

只需使用两个TweenMax.to()来电。为delay:提供一个duration参数和一个较小的值。

答案 1 :(得分:0)

您可以保存第一个TweenMax.to并为TweenEvent.UPDATE事件附加一个侦听器,这样您就可以获得每次tweener更改值时调用的函数。

然后获取currentProgress的值并检查该值是否大于0.5(这意味着它超过了补间的中间)并启动第二个补间。你需要一个bool变量,所以你只需要每中间补间一次。

您可以为TweenEvent.REPEAT事件添加另一个侦听器,以便在补间重复时可以将alpha对象的值重置为1。

var middle:Boolean = false;
TweenMax tween = TweenMax.to(textOne, 14, {x:xScreenPos - 150, ease:SlowMo.ease.config(1, 0), repeat:-1});
tween.addEventListener( TweenEvent.UPDATE, updateListener );
tween.addEventListener( TweenEvent.REPEAT, repeatListener );

function updateListener( e:TweenEvent ):void
{
  if( tween.currentProgress > 0.5 && middle == false )
  {
   TweenMax.to(textOne, 7, {ease:SlowMo.ease.config(1, 0), repeat:0, autoAlpha:0});
   middle = true;
  }
}

function repeatListener( e:TweenEvent ):void
{
 textOne.alpha = 1.0;
 middle = false;
}

希望这有帮助