【问题标题】:ActionScript3: removeEventListener with function parameterActionScript3:带函数参数的 removeEventListener
【发布时间】:2015-09-11 16:23:09
【问题描述】:

如何在 actionscript 中从 MovieClip 中删除 EventListener?下面是我的示例代码。

import flash.events.MouseEvent;
import flash.geom.ColorTransform;
var color: ColorTransform = new ColorTransform();
color.color = 0x00CC66;
colorChange_mc.buttonMode = true;
colorChange_mc.addEventListener(MouseEvent.MOUSE_OVER, changeColor(color));
colorChange_mc.addEventListener(MouseEvent.MOUSE_OUT, changeColorToNormal);

function changeColor(color: ColorTransform): Function {
    return function (e: MouseEvent): void {

        colorChange_mc.transform.colorTransform = color;
      }
 }

 function changeColorToNormal(e: MouseEvent): void {
      var color: ColorTransform = new ColorTransform();
      color.color = 0x000033;
       colorChange_mc.transform.colorTransform = color;
 }


  changer_mc.buttonMode = true;
  changer_mc.addEventListener(MouseEvent.MOUSE_DOWN, removeEvent);
  function removeEvent(e: MouseEvent): void {
       colorChange_mc.removeEventListener(MouseEvent.MOUSE_OVER,      changeColor(color));

  }

我在stage 上创建了两个MovieClips,colorChange_mc 有两个EventListeners,一个用于mouseDown,一个用于mouseOut。当按下 change_mc 按钮时,我想删除EventListener 之一。我能够在不将参数传递给 changeColor 函数的情况下删除EventListener。但在我的真实课堂中,这个参数起着至关重要的作用。

【问题讨论】:

  • 如果使用类,您尝试做的所有事情都会非常容易。您的 colorChange_mc 可以是一个类的实例并在内部处理所有内容,而无需经历所有那些丑陋的黑客攻击。

标签: actionscript-3 mouseevent flash-cc


【解决方案1】:

改用 class-var - 你的代码中已经有一个。为了保持直截了当,我创建了第二个 ColorTransform 作为类变量 - normalColor

import flash.events.MouseEvent;
import flash.geom.ColorTransform;    
var color: ColorTransform = new ColorTransform();
color.color = 0x00CC66;
var normalColor: ColorTransform = new ColorTransform();
normalColor.color = 0x000033;
colorChange_mc.buttonMode = true;
colorChange_mc.addEventListener(MouseEvent.MOUSE_OVER, changeColor);
colorChange_mc.addEventListener(MouseEvent.MOUSE_OUT, changeColorToNormal);

function changeColor(e:MouseEvent): void{

    colorChange_mc.transform.colorTransform = color;

}

function changeColorToNormal(e:MouseEvent): void {

    colorChange_mc.transform.colorTransform = normalColor;
}


changer_mc.buttonMode = true;

changer_mc.addEventListener(MouseEvent.MOUSE_DOWN, removeEvent);
function removeEvent(e:MouseEvent): void {
    colorChange_mc.removeEventListener(MouseEvent.MOUSE_OVER,  changeColor);
}

您好。

【讨论】:

  • 错了。首先,他添加事件侦听器的代码在“它正在工作”方面是正确的——表达式changeColor(color) 返回一个函数,该函数充当事件侦听器。其次,您的解决方案提出 another 函数返回而不是正确的事件侦听器,因为您的函数接受错误的参数集并返回奇怪的类型而不是 void
  • @Vesper:谢谢!第二:copy'n'paste错误。对不起。第一:是的,但是 ;-) 。恕我直言,这不是以干净的方式对鼠标侦听器进行编程的方法。我的代码正在运行。所以我不明白downvoting。问候
  • 这样更好。谢天谢地,如果导致投反对票的问题得到解决,投反对票是可撤回的。
  • 安德烈您好,感谢您的回答。我发布了这个示例代码作为示例,但在我的实际项目中,我有 30 个按钮,每个按钮都有自己的可见 swf 文件。这就是为什么在 addEventListener 函数中参数传递对我来说很重要的原因。简而言之,我只想删除那个有 pramater 的事件。
  • 那么你可以使用dictionary。有了这个,您可以从单击的按钮引用您的 30 ColorTransforms。
【解决方案2】:

问题在于,为了移除监听器,您必须识别最初传递给它的函数。但是您没有对该函数的引用,因为它是匿名的并且存在于全局范围内。

考虑面向对象。把所有改变颜色的功能放到一个类中。你真正想做的就是

  • 指定颜色值
  • 能够再次禁用整个功能。

colorChange_mc 的类中添加两个方法,让你这样做:

public function set color(value:uint):void

 public function set disable(value:Boolean):void

或者,如果您希望这样做,您可以override enabled setter 函数将您的逻辑与它联系起来。

通过这种方式,您可以将当前使主时间线膨胀到类中的大部分代码重构。

【讨论】:

    【解决方案3】:

    根据我的第一个答案和您对此处新事实的评论是使用Dictionary...的更多按钮/颜色的解决方案...

    import flash.events.MouseEvent;
    import flash.geom.ColorTransform;
    import flash.utils.Dictionary;
    import flash.display.MovieClip;
    
    var normalColor: ColorTransform = new ColorTransform();
    normalColor.color = 0x000033;
    //button1-30 are the instancenames of your buttons
    var initObj:Array=[{btn:button1, color:0xFFFFFF},
                       {btn:button2, color:0xFF0000},
                       {btn:button3, color:0x00FF00},
                        ... 
                       {btn:button30, color:0x000000},
                       ];
    
    var dict:Dictionary = new Dictionary();
    
    
    initButtons();
    
    function initButtons():void
    {
        for each (var item:Object in initObj)
        {
            var btn = item.btn;
            btn.addEventListener(MouseEvent.MOUSE_OVER, changeColor);
            btn.addEventListener(MouseEvent.MOUSE_OUT, changeColorToNormal);
            dict[btn] = {color:item.color};
        }
    }
    
    function changeColor(e:MouseEvent):void
    {
    
        var btn:MovieClip = e.target as MovieClip;
        var color:uint = dict[btn].color;
        var cT:ColorTransform=new ColorTransform();
        cT.color = color;
        colorChange_mc.transform.colorTransform = cT;
    
    }
    
    function changeColorToNormal(e:MouseEvent):void
    {
        colorChange_mc.transform.colorTransform = normalColor;
    }
    

    您好。

    【讨论】:

      【解决方案4】:

      感谢您的回复。正如我之前所说,我上面发布的代码只是一个示例。对不起,如果我问了不清楚的问题。我通过在按下 colorChange 按钮时禁用某些特定按钮来解决我的问题。

      _userCardsButtons_mc.mouseEnabled = false;
      _userCardsButtons_mc.mouseChildren = false;
      _userCardsButtons_mc.buttonMode = false;
      

      这段代码禁用了我之前添加的事件监听器。

      【讨论】:

      • 没有。它不会删除侦听器,它只会避免 MovieClip 触发 MouseEvents。您的代码将例如如果您尝试删除 MovieClips,会导致内存问题,因为听众已经注册......最好更深入地了解所有提供的答案。有你需要的一切......
      • 我的意思是“禁用事件侦听器”它停止对已注册的任何事件做出反应,它解决了我的问题。我知道它不会从该movieClip 中删除eventListeners。
      猜你喜欢
      • 2013-01-31
      • 2016-10-09
      • 2015-01-06
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      相关资源
      最近更新 更多