Tween 问题


最近在研究AS3的Tween类,其程序结构和AS2的基本一样,不同的是事件绑定机制 。不过我遇到了一个很奇怪的问题,写个帖子和大家分享一下体会。 核心代码如下:
//30帧每秒 import flash.events.MouseEvent; import fl.transitions.Tween; import fl.transitions.easing.*; import fl.transitions.TweenEvent; function openPanel(event:MouseEvent):void { var myTween:Tween = new Tween(panelMC, "y", Bounce.easeOut, -800, 0, 15,, false); } panelMC是舞台上的一个MovieClip,用一个button click事件去触发openPanel函 数,让panelMC用15帧从y=-800变成y=0; 我测试了几次,发现有时候panelMC会停在那里不动。这种情况不是每次都出现, 根据观察,一次tween完成后,过若干秒,再按按钮,如此操作两边(即第三次触发事 件),就会 出现panelMC不动的情况。 于是我把TweenEvent的事件绑定上,想看一下哪一步出了问题。 function openPanel(event:MouseEvent):void { var myTween:Tween = new Tween(panelMC, "y", Bounce.easeOut, -800, 0, 15,, false); myTween.addEventListener(TweenEvent.MOTION_START, estart); myTween.addEventListener(TweenEvent.MOTION_STOP, estop); myTween.addEventListener(TweenEvent.MOTION_CHANGE, echange); myTween.addEventListener(TweenEvent.MOTION_FINISH, efinish); } function estart (event:TweenEvent):void { trace('start'); } function estop (event:TweenEvent):void { trace('stop'); } function efinish (event:TweenEvent):void { trace('finish'); } function echange (event:TweenEvent):void { trace(event.time); } 结果如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 stop finished 发现,此时是没有start的,google了一下,找到了答案:在绑定MOTION_START侦 听的时候,START已经触发了。于是将代码修改成 var myTween:Tween = new Tween(panelMC, "y", Bounce.easeOut, -800, 0, 15, , false); myTween.stop(); myTween.addEventListener(TweenEvent.MOTION_START, estart); myTween.start(); 这样就OK了。此问题和panelMC停顿无关,属于题外话。 事件绑定好之后再测试,发现echange函数会在开始执行不久变停止执行,意味着T Tween自行停止了。 结果如下: start 1 2 有时候执行到2结束,有时候是3。这个问题我百思不得其解,研究AS3的文档也没 有线索,最后在国外的论坛上找到了类似问题,老外给出的解决方法是:将Tween放到 一个数组中。根据他们的建议,我修改了一下代码, var tweens:Array = new Array(); var tween_count:Number; function openPanel(event:MouseEvent):void { tweens[tween_count] = new Tween(panelMC, "y", Bounce.easeOut, -800, 0, 15, false); tween_count++; } 问题果然解决了,不知道其他网友是否也遇到过类似的问题。 注:我做了一个测试程序,只放了一个panelMC和一个button,结果测了半天都很 正常,当Flash中出现其他的Tween就会出问题,老外也说他们是使用很多Tween的时候 会出问题,看来Tween虽然简便,但还是有危险的暗礁存在。

转址:http://www.newsmth.net/nForum/#!article/Flash/30070

原文地址:https://www.cnblogs.com/flashweb/p/Actionscript.html