【问题标题】:How to give dynamically created buttons actions for each one - part 2如何为每个按钮动态创建按钮操作 - 第 2 部分
【发布时间】:2009-09-23 21:03:28
【问题描述】:

大家好,Flashers :)

我在 StackOverFlow 上提出的第一个问题涉及这个问题,我有一个数组,它创建了几个不同的按钮。但是我不知道如何为他们分配操作: How to give dynamically created buttons actions for each one - part 1

感谢Joel Hooks,我能够让我的代码正常工作。然而这一次,我没有将导入的图形用作我的库中的类,而是通过绘制渐变*(不需要导入 jpg)*来创建影片剪辑。现在我又遇到了另一个可怕的 "not compile time constant" 错误。我相信这与我如何尝试确定单击或翻转的按钮实例有关。

上一个按钮创建(工作)代码:

for (var i:Number=0; i

buttons.push(navButton); 按钮[i].addEventListener(MouseEvent.MOUSE_UP,handleButtonClick); 按钮[i].addEventListener(MouseEvent.ROLL_OVER,handleButtonOver); 按钮[i].addEventListener(MouseEvent.ROLL_OUT,handleButtonOff); }

上一个监听器(工作)代码:

function handleButtonOver(event:MouseEvent):void {

var button:NavButton = event.target as NavButton; var id:Number = Number(button.name.split("button")1); 如果(按钮) TweenLite.to(buttonRolls[id], .4, {alpha:1, ease:Strong.easeOut}); cataText[id].defaultTextFormat = a12Green; cataText[id].text = myXMLArray[id].id; }

当前按钮创建代码:

for (var i:Number = 0; i < num; i++) {
trace("loop number = "+i);

var blueGradient:MovieClip = new MovieClip();
 blueGradient.name = "button" +i;
 blueGradient.graphics.beginGradientFill(bGrad, bColors, bAlphas, bRatios ,bMatrix)
 blueGradient.graphics.drawRect(0, 0, 266, 40);
 blueGradient.x = i * navSIZE;
 blueGradient.y = navBtnY;
 blueGradient.buttonMode = true;
addChild(blueGradient);

buttons.push(blueGradient)

buttons[i].addEventListener(MouseEvent.MOUSE_UP, handleButtonClick);
buttons[i].addEventListener(MouseEvent.ROLL_OVER, handleButtonOver);
buttons[i].addEventListener(MouseEvent.ROLL_OUT, handleButtonOff);

}

当前按钮监听代码:

function handleButtonOver(event:MouseEvent):void {
var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)
 cataText[id].defaultTextFormat = navFontRoll;
 cataText[id].text = myArray[id].id;

}

如果以下行被注释掉,当前电影才会正常运行:

var button:blueGradient = event.target as blueGradient;

因为这就是导致出现非编译时间常数错误的原因。 但是,通过删除该行,所有按钮都是 button1,而不是动态创建的 2 个名为 button0 和 button1 的按钮。

这里的任何帮助或指示将不胜感激!提前感谢您查看我的代码。

【问题讨论】:

  • 我建议您阅读一些关于 Action Script 中的 OOP 的内容 - 它会对您有很大帮助。 Flash 文档中有“准备就绪”的示例。只管“上课”。

标签: flash actionscript-3 button compile-time compile-time-constant


【解决方案1】:

您的问题是您将 blueGradient 类与按钮对象混淆了。在原始处理程序中,您的代码说:

var button:NavButton = event.target as NavButton;
var id:Number = Number(button.name.split("button")[1]);
if(button)....

但是在你的新代码中,

var button:blueGradient = event.target as blueGradient;
var id:Number = Number(blueGradient.name.split("button")[1]);
if(blueGradient)

你看出区别了吗?在这两种情况下,您都将按钮对象称为“var button” - 但在新版本中,您编写“blueGradient.name.split...”而不是“button.name.split...”,并且相同为您的 if() 语句。

var 关键字定义对象的名称。语法是 var [objectName]:[objectType],当您使用该对象时,您总是希望通过其名称而不是其类型来引用它。除非你有一个带有静态方法的静态类,但这样更高级。

所以,简而言之:在你的新处理程序的这两个地方用“button”替换“blueGradient”,它应该可以解决你的问题。希望对您有所帮助!

【讨论】:

  • 老哥,如果我可以给你一个建议:使用 MovieClip 而不是 NavButton 来回答问题 - 这可能会误导初学者;)
【解决方案2】:

我认为,由于 as 关键字用于强制转换,因此您需要此行:

var button:MovieClip = event.target as MovieClip;

blueGradient 似乎是变量名,而不是类名。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多