2

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

我应该Event.MOUSE_LEAVE用来检测鼠标何时离开舞台,并关闭任何启用的导航项目吗?这就是我一直在尝试做的事情,但是在从我的听众那里获得任何输出时遇到了麻烦。有任何想法吗?

替代文字 http://marcysutton.com/blog/wp-content/uploads/2010/01/redpropeller.png

对于与 Flash IDE 中的影片剪辑关联的类,这是注册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
    }
}

}
4

2 回答 2

1

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

于 2010-01-06T00:49:08.083 回答
0

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

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

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

于 2010-01-12T16:29:57.307 回答