2010-01-05 87 views
2

我正在开发一个网站,其中包含从上到下覆盖整个舞台的导航项目(请参阅下面的更改图像),用户使用鼠标轻松退出舞台,不会触发“关闭”所述导航项目所需的MouseEvent.MOUSE_OUT事件。当鼠标离开舞台时,AS3: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 
    } 
} 

} 
+0

那是什么图形?您的托管服务是否恢复了一些随机照片? – jedierikb 2010-01-12 17:10:31

+0

在网站发布之前发布实际设计让我觉得很奇怪....用更好的图形取代。 – 2010-05-21 17:45:17

回答

0

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

在你的构造函数中,stage可能不存在于实例中,但是你应该得到一个运行时错误。不过,您在舞台之前使用了“this”关键字。当你在继承自Object的类中使用'this'(你的类通过MovieClip-> DisplayObject-> EventDispatcher-> Object)时,如果该属性不存在,编译器不会抛出错误,因为它试图创建财产作为'this'的成员。发生这种情况是因为Object类是动态的,这意味着可以随时创建新属性,而无需在头中声明它们为类变量 - 只需在使用该动态属性时使用“this”关键字即可。当你使用this.stage时,如果stage不存在,该类为你创建属性阶段。然而,这不是你想要的阶段,所以这个监听器只是附着在一个空的对象上,它什么都不做。在引用阶段时尝试删除“this”,我相信你会在某个时候看到错误。一般来说,对属性使用'this'是不好的做法,因为编译器会忽略该属性的类型错误。

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

1

答:Event.MOUSE_LEAVE不会在IDE火。当电影嵌入HTML页面时,它工作正常。谢谢你的帮助!

+0

您使用的是什么版本的Flash。我在CS3和CS4中测试过,它在IDE中对我来说工作的很好。 – sberry 2010-01-07 16:49:02

+0

Flash CS3 ...但即使在一个纯粹的瑞士法郎和一个简单的文档类,我没有输出。但是,一旦我将我的文件上传到网络,我的MouseEvent.MOUSE_OUT事件触发得很好,无需使用Event.MOUSE_LEAVE。 – 2010-01-07 17:45:48

+0

我可以验证这在IDE中也不适用于我。我在OS X 10.6.3上使用CS4 10.0.2 – 2010-05-26 18:53:10

相关问题