【问题标题】:AS3: MOUSE_OUT not firing when Mouse leaves stageAS3:鼠标离开舞台时 MOUSE_OUT 未触发
【发布时间】:2011-01-01 20:50:30
【问题描述】:

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

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

alt text 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
    }
}

}

【问题讨论】:

  • 那个图形是怎么回事?您的托管服务是否恢复为随机照片?
  • 在网站启动之前发布实际设计让我感到很奇怪......替换为更好的图形。

标签: actionscript-3 ide stage mouseout mouseleave


【解决方案1】:

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

【讨论】:

  • 您使用的是什么版本的 Flash。我在 CS3 和 CS4 中都进行了测试,并且在 IDE 中对我来说效果很好。
  • Flash CS3... 但即使在一个裸 swf 和一个简单的 Document 类中,我也没有输出。但是,一旦我将文件上传到网络上,我的 MouseEvent.MOUSE_OUT 事件就会很好地触发,从而不再需要 Event.MOUSE_LEAVE。
  • 我可以验证这对我在 IDE 中也不起作用。我在 OS X 10.6.3 上使用 CS4 10.0.2
【解决方案2】:

您正在尝试在构造函数中为 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' 关键字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多