flex中自定义效果(effect),repeatCount的实现

这个标题其实也不准确,大致意思是说:repeatCount是Effect基类的成员,怎么在自己定义的effect中实现repeat的效果的问题。

关于如何自定义effect,网上有文章,这里就不啰嗦了,引用一篇就写得不错的博文,有代码有演示,可以跟着学习一下:flex 自定义TweenEffect方法

如果想了解得更详细一点,可以看看Flex Builder 3\sdks\3.2.0\frameworks\projects\framework\src\mx\effects目录下的几个文件:Effect.as EffectInstance.as effectClasses\TweenEffectInstance.as。这几个文件是基类,里面的注释非常详细,包括自己继承的话需要Override哪些函数都有说明,然后就可以找Move.as和MoveInstance.as学习一下,参考他的自己实现一下就行了。

这里主要说的是如何实现repeat的效果。在effects目录下全文搜索一下,发现repeatCount在所有的效果类里都没有出现过,一开始感觉都找不到参考,不知道怎么办才好。那就从头看起吧。

首先在Effect.as的initInstance函数里,可以看到这么一句“instance.repeatCount = repeatCount;”,也就是说这个repeatCount已经自动赋值到工厂create的instance上了,那么怎么用就看instance自己了。

结果到EffectInstance.as里找了一把,仍然没有太多头绪。但是我们知道Move这个效果是可以多次循环的。来看看他在TweenEnd这里是怎么处理的。从MoveInstance->onTweenEnd跟踪进“super.onTweenEnd(value);”,来到TweenEffectInstance->onTweenEnd,在最后可以发现这么一句“finishRepeat();”。看名字就知道应该跟repeat相关。跟踪到EffectInstance里就能看到这么一段了

xhtml代码
  1. public function finishRepeat():void  
  2.     {  
  3.         if (!stopRepeat && playCount != 0 &&  
  4.             (playCount < repeatCount || repeatCount == 0))  
  5.         {  
  6.             if (repeatDelay > 0)  
  7.             {  
  8.                 delayTimer = new Timer(repeatDelay, 1);  
  9.                 delayStartTime = getTimer();  
  10.                 delayTimer.addEventListener(TimerEvent.TIMER,  
  11.                                             delayTimerHandler);  
  12.                 delayTimer.start();  
  13.             }  
  14.             else  
  15.             {  
  16.                 play();  
  17.             }  
  18.         }  
  19.         else  
  20.         {  
  21.             finishEffect();  
  22.         }  
  23.     } 

意思很明显,在repeatCount还没有结束之前,反复调用play()函数。

我一开始一直试不出效果,现在总结一下,有两个问题:

1. 自己override的onTweenEnd函数最后,没有调用“super.onTweenEnd(value);”;

2. 一些成员变量的初始化没有放到play函数中。因为一些变量(比如不断变大的圆圈的半径),如果只在类构造的时候初始化一次,那么第二次调用play的时候,这个值已经不再是初始值了,自然看不到预期的效果。也就是在play的时候需要将这个effect设置到一个初始状态,这才能看到不断repeat的效果。

发一个效果,嘻嘻,我要做的就是这个发信号。代码里实现的效果是这个圈的半径变大并且淡出,类似魔兽地图上发的信号。代码实现一次变幻,alpha变为0就停止了。这个demo中配置的是repeatCount=3,该effect自动play 3次。

因为使用了pathinfo的关系,FLEX中的view source合成的路径不正确了。可以点击这里查看和下载源码。

Tags: flex,repeatCount