代码之家  ›  专栏  ›  技术社区  ›  Marcy Sutton

AS3:老鼠离开舞台时不开火

  •  2
  • Marcy Sutton  · 技术社区  · 15 年前

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

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

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

    对于在flash-ide中与movieclip关联的类,这是注册 event.mouse离开 倾听者?不管我做什么,它似乎都不起作用。在这种情况下,我必须将电影嵌入浏览器才能触发事件吗?

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

    这是我的主导航系统。

    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 回复  |  直到 15 年前
        1
  •  0
  •   wpjmurray    15 年前

    您正在尝试在构造函数中创建鼠标离开的事件侦听器。如果没有通过addchild()方法将mainnav添加到阶段,则阶段对象可能还不存在。如果主导航系统在设计时已经在舞台上,那么舞台仍有可能无法立即使用。对于从DisplayObject继承的类(movieclip、sprite等),我在构造函数中只做一件事:设置一个event.added-to-stage-listener。当对象已通过父容器的addChild()添加到阶段的显示堆栈中,或者如果对象在设计时已经在阶段中,则该侦听器将触发init()方法。当调用init()方法时,我知道stage属性是可用的。

    在构造函数中,阶段可能还不存在于实例中,但您应该得到一个运行时错误。但是,您在舞台前使用了“this”关键字。当您在继承自对象的类中使用“this”(您的类通过movieclip->displayobject->eventspatcher->对象)时,如果该属性不存在,则编译器不会抛出错误,因为它试图将该属性创建为“this”的成员。这是因为对象类是动态的,这意味着可以在任何时候创建新的属性,而不必将它们声明为头中的类变量——使用该动态属性时,只需使用“this”关键字即可。使用this.stage时,如果stage不存在,则类将为您创建属性stage。但是,这不是您想要的阶段,因此侦听器只是连接到一个空对象,而该对象不做任何事情。在引用阶段时尝试删除“this”,我确信在某个时刻您会看到错误。通常,将“this”用于属性是不好的做法,因为编译器将忽略该属性的类型错误。

    你在上面的一条评论中提到鼠标离开在IDE中不起作用,但是我在CS4中测试了它,它确实起作用。与浏览器的flash player插件相比,您可能看到了与IDE的flash player的性能差异。在某些情况下,如果SWF加载很快并且阶段立即可用,则阶段事件侦听器将从构造函数工作,但它不可靠。将该侦听器移动到init()方法,该方法在添加的\u to \u stage事件之后调用,并且不要使用'this'关键字。

        2
  •  1
  •   Marcy Sutton    15 年前

    回答:event.mouse离开不会在IDE中触发。当电影嵌入到HTML页面中时,它可以正常工作。谢谢你的帮助!