【问题标题】:Flash ActionScript2 loopFlash ActionScript2 循环
【发布时间】:2012-10-12 09:06:24
【问题描述】:

我在一个 Flash 文件中有 180 个按钮,对于所有按钮我都需要翻转和点击事件,所以我使用的代码是:

button1.onRollOver = function() { //on roll over change button color as white
  var color = new Color(button1); 
  color.setRGB("0xFFFFFF"); 
};
button1.onRollOut = function() { //on roll out reset button color to it`s default
  resetColorFunction(); 
};
button1.onPress = function() { //on click/press runs javascript function in page
  getURL("javascript:ButtonPress('button1');"); 
};

问题是我有 180 个按钮,所以我将此代码复制到每个按钮、按钮 1、按钮 2、按钮 3、按钮 4 等,直到按钮 180。

有没有办法用一个简单的代码函数循环遍历所有按钮。

谢谢

【问题讨论】:

    标签: flash actionscript-2


    【解决方案1】:

    您可以在舞台或任何容器中使用for-in 循环。

    for (var item in this) {
        if (this[item] instanceof Button) { //-- Use the most relevent class for abstraction
            var btn = this[item];
            trace ("Button: " + btn._name + " btn._x:" + btn._x + " a: " + btn._alpha);
    
            //-- add Logic for event handlers.
        }
    }
    

    【讨论】:

    • 仅供参考,@wzazza - ArrayCollection 是 flex 框架的一部分,因此也是 AS3。 (由于代表短缺,无法评论其他线程)。
    【解决方案2】:

    您可以在 Actionscript 2 中使用 eval 来轻松标记所有按钮。

    buttonRollOver = function() { ... };
    buttonRollOut = function() { ... };
    buttonPressed = function() { ... };
    
    for (var i=1; i<181; i++)
    {
       eval("button"+i).onRollOver = buttonRollOver;
       eval("button"+i).onRollOut = buttonRollOut;
       eval("button"+i).onPress = buttonPressed;
    }
    

    你已经拥有了一切又好又快的东西。

    【讨论】:

    • 这看起来很有希望:) 这种方法的问题是悬停功能只影响最后一个按钮(button180)。无论我悬停哪个按钮,该功能都会影响最后一个按钮,而不是我悬停的按钮。我在for 方法中创建了函数,例如:eval("a"+i).onRollOver = function(){ var buttonColor = new Color(eval("a"+i)); buttonColor.setRGB("0xFFFFFF"); };。如何使其分别适用于每个按钮?
    • 正在调用 onRollOver 函数,目标是您的按钮本身。所以如果你想修改按钮,你可以在函数内部使用this 来影响它。对于您的示例,您可以使用 eval("a"+i).onRollOver = function(){ var buttonColor = new Color(this); buttonColor.setRGB("0xFFFFFF"); };
    • this["button"+i].onRollOver = buttonRollOver; 也应该直接工作,所以不需要评估
    【解决方案3】:

    您可以将所有这些按钮添加到某种集合中,然后遍历所有元素并添加事件处理程序。 像这样的:

    var buttons:ArrayCollection = new ArrayCollection();
    var button1:Button = new Button();
    var button2:Button = new Button();
    // some more buttons creation ...
    

    每次创建按钮时,只需将其添加到 buttons 集合中即可。

    buttons.addItem(button1);
    buttons.addItem(button2);
    // etc
    

    最后,您只需遍历所有按钮并添加所需的事件处理程序。

    for each (var button:Button in buttons)
    {
        button.onRollOver = function() { // handle RollOver };
        button.onRollOut  = function() { // handle RollOut };
        button.onClick    = function() { // handle Click };
    }
    

    要使用数组,您可以执行以下操作:

    var buttons:Array = [];
    buttons.push(button1);
    // add all other buttons..
    
    for (var i:uint = 0; i < buttons.length; i++)
    {
        var button:Button = Button(buttons[i]);
        button.onRollOver = function() { // handle RollOver };
        button.onRollOut  = function() { // handle RollOut };
        button.onClick    = function() { // handle Click };
    }
    

    【讨论】:

    • 好吧,我想这是这样做的方法,但是没有一些简单的方法可以在不创建 ArrayCollection 的情况下自动循环遍历所有按钮:for each (findAllButtonsInMovie) { //code for each button }
    • 据我所知,语言中没有内置这样的东西。此外,您必须对代码进行的更改似乎只是添加 2 行 - 一行用于声明集合,另一行用于在其中添加按钮(假设您正在循环中创建按钮)。
    • Im trying to use ArrayCollection as you suggested but I get this error: 无法加载类或接口“mx.collections.ArrayCollection”。我在这里缺少什么?
    • 你有正确的导入声明吗?否则你可以只使用一个数组。
    • 你能发布一些使用数组的简单代码示例吗?我就是不能让它工作。我正在使用 Adob​​eFlash CS5.5 和 ActionsScript2.0
    猜你喜欢
    • 2010-09-15
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多