假设我想创建一个按钮。这应该很简单 - 只需创建一个正方形,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;
有没有办法减少事件侦听器的数量,或者在这种情况下更优化代码?我见过的大部分例子对于较大的案件似乎都很浅薄。
答案 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);
}