AS3:当鼠标离开舞台时,MOUSE_OUT不会触发

时间:2010-01-05 23:25:41

标签: actionscript-3 ide stage mouseout mouseleave

我正在开发一个网站,其中包含从上到下覆盖整个舞台的导航项目(请参阅下面的更改图片),用户很容易用鼠标退出舞台,而不是触发MouseEvent.MOUSE_OUT需要“关闭”所述导航项目的事件。

我是否应该使用Event.MOUSE_LEAVE来检测鼠标何时离开舞台,并关闭所有已启用的导航项?这就是我一直在尝试做的事情,但是从我的听众那里得到任何输出都有困难。有什么想法吗?

alt text http://marcysutton.com/blog/wp-content/uploads/2010/01/redpropeller.png

对于与Flash IDE中的movieclip关联的类,这是注册Event.MOUSE_LEAVE侦听器的正确语法吗?无论我做什么,它似乎都没有做任何事情。是不是我必须在浏览器中嵌入电影才能触发事件?

this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);

这是我的MainNav.as课程:

package com.redpropeller {

import com.greensock.*;
import com.greensock.plugins.*;
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class MainNav extends MovieClip { // MainNav is a movieclip in the IDE

    public var colors:Array;

    public function MainNav():void {
        colors = new Array(0xee3124, 0xc72a1f, 0xa62c24, 0x912923, 0x7e221c);
        TweenPlugin.activate([TintPlugin]);

        // trying to target stage through this object
        this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);

        for(var i:Number=0; i<this.numChildren; i++){
            var n = this.getChildAt(i);
            n.useHandCursor = true;
            n.buttonMode = true;

            n.addEventListener(MouseEvent.MOUSE_OVER, navBtnOn);
            n.addEventListener(MouseEvent.MOUSE_OUT, navBtnOff);
        }
    }
    public function mouseLeaveListener(e:Event):void {
        trace('mouseleave'); // nothing ever happens

    }
    private function navBtnOn(e:MouseEvent):void {
        TweenLite.to(e.currentTarget.bar_mc, 0.01, {tint:0x333333});
    }
    private function navBtnOff(e:MouseEvent):void {
        TweenLite.to(e.currentTarget.bar_mc, 0.01,
            {tint:uint(colors[this.getChildIndex(MovieClip(e.currentTarget))])});
            // changes color back to specific tint
    }
}

}

2 个答案:

答案 0 :(得分:1)

答案:事件.MOUSE_LEAVE不会在IDE中触发。当电影嵌入HTML页面时,它可以正常工作。谢谢你的帮助!

答案 1 :(得分:0)

您正在尝试在构造函数中为MOUSE_LEAVE创建事件侦听器。如果尚未通过addChild()方法将MainNav添加到舞台,则舞台对象可能尚不存在。如果MainNav在设计时已经在舞台上,那么该舞台仍然无法立即使用。对于从DisplayObject(MovieClip,Sprite等)继承的类,我只在构造函数中做一件事:设置一个Event.ADDED_TO_STAGE监听器。当通过addChild()从父容器将对象添加到舞台的显示堆栈时,或者如果对象在设计时已经在舞台上,该侦听器将触发init()方法。当我的init()方法被调用时,我知道stage属性可用。

在构造函数中,实例中可能不存在stage,但是您应该遇到运行时错误。但是,您在舞台前使用'this'关键字。当你在继承自Object的类中使用'this'时(你的类通过MovieClip-&gt; DisplayObject-&gt; EventDispatcher-&gt; Object),如果属性不存在,编译器将不会抛出错误,因为它尝试创建该属性作为'this'的成员。发生这种情况是因为Object类是动态的,这意味着可以随时创建新属性,而无需在头文件中将它们声明为类变量 - 在使用该动态属性时只需使用'this'关键字。当您使用this.stage时,如果stage不存在,则类会为您创建属性阶段。但是,这不是您想要的阶段,因此侦听器只是附加到一个不执行任何操作的空对象。尝试在引用阶段时删除“this”,我确定你会在某个时候看到错误。通常,对属性使用'this'不是好习惯,因为编译器会忽略该属性的类型错误。

您在上面的一条评论中提到MOUSE_LEAVE在IDE中不起作用,但我从CS4测试了它,它确实有效。与浏览器的Flash Player插件相比,您可能正在目睹IDE的Flash Player的性能差异。在某些情况下,如果SWF快速加载并且stage立即可用,则舞台事件侦听器将在构造函数中工作,但它不可靠。将该侦听器移动到ADDED_TO_STAGE事件之后调用的init()方法,并且不要使用'this'关键字。