打印

[AS3] 难道是BUG?

我做了个小动画:鼠标移到图标上时,背景放大;鼠标移除图标时,背景还原。

可是,问题出现了,我的鼠标移除后,背景还原到原来大小,又突然变大。问题出在哪里呢?我把源文件附上,忘有空的朋友帮我一下。

注:flash CS3, AS3


import fl.transitions.*;
import fl.transitions.easing.*;

var iconIns=new icon();
addChild(iconIns);
iconIns.x=stage.stageWidth/2;
iconIns.y=stage.stageHeight/2;

iconIns.iconContent.addEventListener(MouseEvent.MOUSE_OVER,zoom);
iconIns.iconContent.addEventListener(MouseEvent.MOUSE_OUT,zoomout);

function zoomout(e:Event)
{
       var initialSX=1.2;
       var finalSX=1;
       var duration=.25;
       var scaleXTween:Tween=new Tween(iconIns.iconBG,"scaleX",Strong.easeOut, initialSX,finalSX,duration, true);
       var scaleYTween:Tween=new Tween(iconIns.iconBG,"scaleY",Strong.easeOut, initialSX,finalSX,duration, true);
}
function zoom(e:Event)
{
       var initialSX=1;
       var finalSX=1.2;
       var duration=1;
       var scaleXTween:Tween=new Tween(iconIns.iconBG,"scaleX",Elastic.easeOut, initialSX,finalSX,duration, true);
       var scaleYTween:Tween=new Tween(iconIns.iconBG,"scaleY",Elastic.easeOut, initialSX,finalSX,duration, true);
}
用rollover和rollout,参考文章
http://www.asarea.cn/showdiary.jsp?id=120
ATHER Shu www.asarea.cn
出现这个问题,不是楼上说的冒泡的问题。
而是TWEEN类的重复执行。
zoomout()中的TWEEN实例执行完了,有可能 zoom()时定义的TWEEN还没有执行完,所以最终结果就是zoom中定义的放大效果执行在了最后。

一般在一个新的TWEEN定义时,如果是更新某个对象的同一属性,需要加个stop()强制原先的tween实例停止运行。
复制内容到剪贴板
代码:
import fl.transitions.*;
import fl.transitions.easing.*;
var iconIns=new icon();
addChild(iconIns);
iconIns.x=stage.stageWidth/2;
iconIns.y=stage.stageHeight/2;
iconIns.iconContent.addEventListener(MouseEvent.ROLL_OVER,zoom);
iconIns.iconContent.addEventListener(MouseEvent.ROLL_OUT,zoomout);
var scaleXTween:Tween;
var scaleYTween:Tween;
function zoomout(e:Event) {
    var initialSX=1.2;
    var finalSX=1;
    var duration=.25;
    scaleXTween&&scaleXTween.stop();//停止执行前面定义的效果
    scaleYTween&&scaleYTween.stop();
    scaleXTween=new Tween(iconIns.iconBG,"scaleX",Strong.easeOut, initialSX,finalSX,duration, true);
    scaleYTween=new Tween(iconIns.iconBG,"scaleY",Strong.easeOut, initialSX,finalSX,duration, true);
}
function zoom(e:Event) {
    var initialSX=1;
    var finalSX=1.2;
    var duration=1;
    scaleXTween&&scaleXTween.stop();//注意这两行
    scaleYTween&&scaleYTween.stop();
    scaleXTween=new Tween(iconIns.iconBG,"scaleX",Elastic.easeOut, initialSX,finalSX,duration, true);
    scaleYTween=new Tween(iconIns.iconBG,"scaleY",Elastic.easeOut, initialSX,finalSX,duration, true);
}
http://www.flash023.cn 终极讨厌
我想错了,哈哈

[ 本帖最后由 sshong 于 2008-5-27 20:02 编辑 ]
ATHER Shu www.asarea.cn
楼主出现的问题是鼠标移出,最终却执行了zoom事件中的效果。
但按楼上关于冒泡的分析(这个分析我也同意)。无论事件怎么发生,zoomout总是zoomout,不会在鼠标移出时执行zoom。那么楼主的问题就不应该出现。

继续分析我3楼时的观点:
zoom中var duration=1 放大的tween实例需要1秒来完成
,zoomout中的var duration=.25缩小只需要1/4秒来完成,那么当鼠标在1秒内移进,移出,很有可能zoom内的tween还没执行完,而zoomout中的tween就结束了。因此最终效果显示成了zoom 中的tween类操作结果。

这也是为什么楼主的文件中,鼠标进去1秒后再移出不会有问题,而是在快速移进移出才有问题的原因所在。
因此我仍然认为让tween加上stop()强制结束才是解决问题的关键。
http://www.flash023.cn 终极讨厌

TOP

hoho,我想错了,其实对于子addlistener,父的移入移出永远不会被子捕获的,sorry,我想错了,我把它当成我曾经碰到过的对父addlistener,子的移入移出会被父捕捉的问题了
ATHER Shu www.asarea.cn

TOP

感谢各位兄台的热心解答,问题已解决

我运行了flash023兄的代码,问题解决了。感谢各位这么详细认真的解答,受益匪浅!

TOP