AS3,for movie创建按钮在movieclip中以及如何调用它?

时间:2010-08-13 08:07:12

标签: actionscript-3 button movieclip

这是我的完整代码

import fl.controls.*;

var test:MovieClip = new MovieClip();
var btn:Button;

for(var i:int = 1; i<=7; i++){
    btn = new Button();
    btn.name = "btn" + i;
    btn.x = i * 100;
    test.addChild(btn);
    btn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent) { nothing(i); });
}

addChild(test);

function nothing(bla:int):void {
    trace("You clicked " + bla);
}

结果:

You clicked 8
You clicked 8
You clicked 8...

无论如何,我可以使用for循环创建不同的名称按钮,并将其添加到事件监听器中吗?

3 个答案:

答案 0 :(得分:1)

您的问题是function(evt:MouseEvent){} closure(JavaScript信息也适用于ActionScript,因为它们都是ECMAScript)。这是你可以做的:

function makeClickListener(i:int) {
    return function(evt:MouseEvent) {
        nothing(i);
    };
}
...
for(...) {
    ...
    btn.addEventListener(MouseEvent.CLICK, makeClickListener(i));
}

答案 1 :(得分:0)

在你的例子中你的i没有做你认为它正在做的事情。你已经将它声明为一个全局变量,并且在你正在做的事情中传入函数是没有意义的。最后,您的按钮只是报告i的当前值(循环后总是为8)。

我喜欢所提供的其他解决方案,但这里有一个更面向对象的解决方案,根据您对按钮(或将来的其他对象)的操作,这可能会有所帮助。

public class MyButton extends Button{
   public var myIndex:Number;
}

现在你使用MyButton而不是Button,并在你的循环中抛出

btn.myIndex = i;

然后附加通用事件处理程序

btn.addEventListener(MouseEvent.CLICK, myHandler);

看起来像这样:

function myHandler(evt:MouseEvent){
   trace(evt.target.myIndex);
}

请参阅...事件的目标始终是您附加事件的对象。对于那个对象,您应该附加您希望保留的任何值。我个人更喜欢这种方法,因为那时信息与对象有关(并且可以被其他可能需要它的元素使用),而不是在处理程序中,只在处理程序中。

答案 2 :(得分:0)

var test:MovieClip = new MovieClip();
var btn:Button;

for(var i:int = 1; i<=7; i++){

 btn = new Button();

 btn.name = i.toString();
 btn.x = i * 100;

 test.addChild(btn);
 btn.addEventListener(MouseEvent.CLICK, nothing);

}


function nothing(event:MouseEvent):void {
    //trace("You clicked " + int( event.currentTarget.name ) );
trace("You clicked " + event.currentTarget.name );
 }