动态添加事件侦听器

时间:2013-06-12 00:52:57

标签: actionscript-3

假设我想创建一个按钮。这应该很简单 - 只需创建一个正方形,addChild将其添加到屏幕上,并为mouse.CLICK事件提供事件监听器

add_btn_listeners():void
 {

   btn[0].addEventListener(MouseEvent.CLICK, btn_clc1);
 }
public function btn_clc1(event:Event):void
 {
   action1();
 }

假设您想要创建20个按钮。然后,您将需要20个类似于上述btn_clc1函数的函数,并使用事件侦听器进行相应的单击。

但是假设您希望通过索引进行非常轻微的操作。例如,btn [0]在同一个监听器btn_clc1监听器中调用action1,btn [1]调用action2等。

一个非常常见的例子是鼠标翻转。例如,在翻转以突出显示正方形时,增加alpha图层以突出显示菜单选择。突出显示的层将取决于索引,例如:btn [index] .alpha = .9;

有没有办法减少事件侦听器的数量,或者在这种情况下更优化代码?我见过的大部分例子对于较大的案件似乎都很浅薄。

2 个答案:

答案 0 :(得分:1)

您可以做的一件事是在事件处理程序的事件对象中,有一个'target'属性。这是指调度事件的对象。您可以将它重新放回到为事件监听器分配的任何内容并访问它,或者可以使用循环/ if块进行比较以找出它是哪个按钮。

import flash.display.Sprite;

var aButton:Sprite = new Sprite();

function clicked(inputEvent:MouseEvent):void {
    var theButton:Sprite = (Sprite) (inputEvent.target);
    trace(theButton); // traces out the sprite

    // can compare
    trace(theButton == aButton); // traces out true

    // if the had any (custom) properties, you could also access them, such as:
    trace(theButton.visible);
}
aButton.addEventListener(MouseEvent.CLICK, clicked, false, 0, true);

答案 1 :(得分:1)

这正是面向对象编程旨在解决的问题类型。只需创建一个包含事件处理程序的类 - 然后您可以根据需要创建任意数量的类。

类示例:

public class MyButton extends Sprite
{
    public function MyButton()
    {
        graphics.beginFill(0);
        graphics.drawRect(0, 0, 50, 30);
        graphics.endFill();

        addEventListener(MouseEvent.CLICK, _mouse);
        addEventListener(MouseEvent.ROLL_OVER, _mouse);
        addEventListener(MouseEvent.ROLL_OUT, _mouse);
    }

    private function _mouse(e:MouseEvent):void
    {
        switch(e.type)
        {
            case MouseEvent.CLICK:
                trace("click");
            break;

            case MouseEvent.ROLL_OVER:
                alpha = 0.9;
            break;

            case MouseEvent.ROLL_OUT:
                alpha = 1;
            break;
        }
    }
}

然后您可以像这样创建它们:

for(var i:int = 0; i < 5; i++)
{
    var btn:MyButton = new MyButton();

    btn.x = i * 60;
    addChild(btn);
}