2013-06-12 222 views
0

假设我想创建一个按钮。这应该很容易 - 只需创建一个正方形,的addChild将其添加到屏幕上的事件侦听器mouse.CLICK事件动态添加事件侦听器

add_btn_listeners():void 
{ 

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

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

但是,假设你想要的行动非常轻微,如索引。例如,在同一个监听器btn_clc1侦听器中,btn [0]调用action1,btn [1]调用action2等。

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

有没有办法在这种情况下减少事件监听器的数量或更优化的代码?我看过的大多数例子对大案例来说似乎都很浅薄。

回答

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