【问题标题】:What is the proper way to handle MouseOver and MouseOut in actionscript?在动作脚本中处理 MouseOver 和 MouseOut 的正确方法是什么?
【发布时间】:2014-04-25 20:30:55
【问题描述】:

这感觉应该很明显,但是我在处理带有动作脚本中的一系列电影剪辑的 MouseEnter 和 MouseOut 时遇到了麻烦。

我有一个用作背景的影片剪辑。在那个背景下,我添加了一个额外的影片剪辑作为一个按钮。在该按钮的 MouseEnter 上,我添加了一个附加的影片剪辑作为悬停状态,并删除了初始按钮。在 MouseOut 上,我删除了 hoverstate 按钮,并读取了原始的普通按钮。

在 90% 的情况下,它会按您的预期工作。但是另外 10% 的时间,在 MouseOut 上,MouseEnter 事件会触发,即使您的鼠标不再在按钮上,它也具有悬停状态,因此您可以这样做。

一些代码来说明,这是我首先添加的主要电影剪辑:

package  {
import flash.display.MovieClip;

public class Menu_Main extends MovieClip {

    var backdrop:Backdrop;

    public function Menu_Main() {
        backdrop = new Backdrop();
        addChild(backdrop);
    }
}

}

这是我后续的影片剪辑逻辑,处理我的菜单按钮的逻辑: 包{

import flash.display.MovieClip;
import flash.events.MouseEvent;

public class Backdrop extends MovieClip {

    var button:MyMenuButton;
    var button_hover:MyMenuButton_Over;

    public function InitializeButton()
    {
        button = new MyMenuButton();

        button.addEventListener(MouseEvent.MOUSE_OVER, Button_MouseOver);
        addChild(button);
    }

    function Button_MouseOver(event:MouseEvent):void
    {
        removeChild(button);

        button_hover = new MyMenuButton_Over();
        button_hover.addEventListener(MouseEvent.ROLL_OUT, ButtonHover_MouseOut);
        addChild(button_hover);
    }

    function ButtonHover_MouseOut(event:MouseEvent):void
    {
        removeChild(button_hover);
        addChild(button);
    }

    public function Backdrop() {

        InitializeButton();

    }
}

}

这里的代码不包括我在合适的地方删除 EventListeners 的尝试。无论添加和删除 EventListener 的组合如何,结果都是一样的。我还尝试了一些 ROLL_OUT 和 ROLL_OVER 的组合,而不是鼠标版本。我不能说我已经完美地使用了它们,但结果还是一样的。

任何人都可以就处理此问题的正确方法提供一些建议吗?

【问题讨论】:

    标签: actionscript-3 flash mouseover mouseout


    【解决方案1】:

    两件事:首先,我使用 Flash CS5.5 和 FlashDevelop 尝试了您的代码,并且没有发现您描述的任何问题。该按钮对我来说效果很好(在旧 P4 机器上)。

    其次,您可以用更少的代码和更少的电影剪辑实现相同的性能。 制作一个带有两个框架的按钮 MC。在 fr 中为按钮的主体着色不同。 2比在fr。 1.

    使用相同的 Main 类。背景类现在看起来像这样:

    package
    {
    
     import flash.display.MovieClip;
     import flash.events.MouseEvent;
    
     public class Backdrop extends MovieClip {
    
     var button:MyMenuButton;
     var button_hover:MyMenuButton_Over;
    
    public function Backdrop() 
    {
       InitializeButton();
    }
    
     public function InitializeButton()
     {
        button = new MyMenuButton();
        button.stop();
        button.addEventListener(MouseEvent.MOUSE_OVER, Button_Over);
        addChild(button);
     }
    
     function Button_Over(event:MouseEvent):void
     {
        button.gotoAndStop(2);        
        button.addEventListener(MouseEvent.MOUSE_OUT, Button_Out);
     }
    
     function Button_Out(event:MouseEvent):void
     {
        button.gotoAndStop(1);    
     }
    
    }
    
    }
    

    【讨论】:

    • 非常感谢克雷格的例子。它似乎起到了作用,除了我得到了一些闪烁的效果。我将不得不看看删除/读取一些事件监听器是否可以解决问题。
    • 我将 MOUSE_OUT 和 MOUSE_OVER 事件更改为 ROLL_OUT 和 ROLL_OVER。这帮了大忙。
    • 如果您使用我发布的代码并且您只有一个带有 2 帧的按钮 MovieClip,您不应该有任何“闪烁”。如果您仍然有“闪烁”,请告诉我。
    • 我将MOUSE_OUT和MOUSE_OVER事件更改为ROLL_OUT和ROLL_OVER后,闪烁停止了。但是,当我将鼠标悬停在它上面时,这些事件似乎会“额外”触发。鼠标悬停当然应该只触发一个事件,但发生在我身上的似乎是 OVER 触发,然后是 OUT,然后是另一个 OVER。我已经看到这种情况发生在我最初尝试处理这个问题的方式上。非常混乱。
    • 似乎有些闪烁是由于我使用的艺术!非常感谢克雷格 :) 希望我能从这里得到剩下的!
    【解决方案2】:

    这是因为动作脚本中的事件不是同步的。

    这里的最佳做法是添加一个透明按钮,您将在该按钮上添加所有需要的侦听器 - ROLL_OVER 和 ROLL_OUT。在每个处理程序上 - 做你想做的事 - 添加或删除孩子,这并不重要,因为调度事件的实际目标仍然存在并且它仍然是相同的。

    干杯!

    【讨论】:

    • 感谢您的评论。我尝试了您的建议,但最终会产生相同的效果。空白按钮,向该空白按钮添加和删除不同的按钮状态,并添加 roll_over 和 roll_out 事件监听器,同样 10% 的时间 roll_out 将导致额外的 roll_over 事件。我一定让这种方式太难了。
    • 我的意思是添加不同的按钮状态,而不是对不可见的按钮做任何事情——它就像 OTHER 按钮的悬停区域。我建议你尝试将这些状态合并到一个按钮中(如果可能的话),然后只使用 gotoAndStop('over'),而不是那种复杂的解决方案。
    • 感谢您的建议安德烈,我会尝试以一种或另一种方式解决这个问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多