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

本站内容除转载精华分类或注明zz以外,其他均为原创内容。转载请注明出处,yhustc.com版权所有

这个标题其实也不准确,大致意思是说: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


7 Responses to “flex中自定义效果(effect),repeatCount的实现”

  1. kakashilw  | 2009-08-16 20:46:48

    Y兄现在开始研究flex了啊。。。

    我最近也准备也就下这方面知识。。。

    不知有啥资料或是书籍推荐否???
  2. yhustc  | 2009-08-16 20:50:16

    呵呵,我也不知道什么书好,去图书馆借了两本中文的觉得都不行,建议到adobe官网去下这本电子书“getting_started_with_Flex3”,官网推荐的。然后就是用flex builder自带的那个帮助手册。一般情况下可以搜一搜,看不明白的话点下面的链接“Submit Feedback on LiveDocs”,打开的网页内容是一样的,但是下面有网友评论,一些看不明白的问题,那里就有人问了,而且还有解答,:-)
  3. squall  | 2009-08-28 20:18:58

    能给出源码学习一下吗
  4. yhustc  | 2009-08-29 13:35:10

    日志已经更新了,在FLASH的演示上面有一个链接可以查看和下载源码
  5. cccing  | 2009-09-17 20:32:45

    中文的推荐一个blog.minidx.com,上面都是些入门简单例子,应该平时搜索也能看到。还有一些as3ers的博客,我最近也打算做一个详细深入点的,想用你的博客
  6. lingboshiwo  | 2010-08-29 22:43:37

    使用Move时,总是觉得在刚开始移动的时候是加速的,在最后变成减速了,查看帮助时,只写着是平滑移动,不知为何不是始终的匀速?
  7. yhustc  | 2010-08-30 09:34:01

    LS的朋友,关于这个问题我也不清楚。可以自己写一个MOVE试试,看是否仍然是这个样子的。MOVE不难,主要是一定间隔后计算位置并且设置好位置,时间足够短,就是动画效果了。

发表评论