ActionScript3:带有函数参数的removeEventListener

时间:2015-06-25 07:31:48

标签: actionscript-3 mouseevent flash-cc

如何从动作脚本EventListener中删除MovieClip?以下是我的示例代码。

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));

  }

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

4 个答案:

答案 0 :(得分:1)

使用class-var - 您已经在代码中使用了一个。为了保持原状,我创建了第二个ColorTransform作为类-var - 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);
}

问候。

答案 1 :(得分:0)

问题是,为了删除侦听器,您必须识别最初传递给它的函数。但是你没有参考这个函数,因为它是匿名的,并且存在于全局范围内。

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

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

colorChange_mc类中添加两个方法,可以执行此操作:

public function set color(value:uint):void

 public function set disable(value:Boolean):void

或者,你可以override enabled setter函数将你的逻辑绑定到它,如果这是你想要的。

通过这种方式,您可以将当前主要时间线上的大部分代码重构为类。

答案 2 :(得分:0)

根据我的第一个答案,您对新事实的评论是使用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;
}

问候。

答案 3 :(得分:0)

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

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

此代码禁用了我之前添加的事件侦听器。