嗨,同事弗拉瑟斯:)
我在StackOverFlow处的第一个问题处理了这个问题,我有一个数组创建了几个不同的按钮。但是我不知道如何为他们分配动作: How to give dynamically created buttons actions for each one - part 1
感谢Joel Hooks,我能够让我的代码正常运行。但是这次不是使用导入的图形作为我的库中的类,而是通过绘制渐变*(不需要导入jpg)来创建movieClip *。现在我再次遇到另一个可怕的“not compile time constant”错误。我认为这与我如何确定点击或滚动的按钮实例有关。
上一个按钮创建(工作)代码:
for(var i:Number = 0; i< myXMLArray.length; i ++){ navButton = new NavButton; navButton.name =“button”+ i; navButton.x = i * navSIZE; navButton.y = navBtnY; navButton.buttonMode = TRUE; thumbsMov.addChild(navButton);
buttons.push(navButton); 按钮[I] - 阅读进度 - (侦听MouseEvent.MOUSE_UP,handleButtonClick); 按钮[I] - 阅读进度 - (MouseEvent.ROLL_OVER,handleButtonOver); 按钮[I] - 阅读进度 - (MouseEvent.ROLL_OUT,handleButtonOff); }
上一个侦听器(工作)代码:
function handleButtonOver(event:MouseEvent):void {
var按钮:NavButton = event.target为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而不是动态创建的名为button0和button1的2个按钮。
这里的任何帮助或指示将不胜感激!提前感谢您查看我的代码。
答案 0 :(得分:2)
您的问题是您将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按钮” - 但是在新版本中你编写了“blueGradient.name.split ...”而不是“button.name.split ...”并且相同对于你的if()语句。
var关键字定义对象的名称。语法是var [objectName]:[objectType],当你使用该对象时,你总是希望通过它的名称而不是它的类型来引用它。除非你有一个带静态方法的静态类,否则它会更高级。
因此,简而言之:在新处理程序的这两个地方用“button”替换“blueGradient”,它应该清除你的问题。我希望有所帮助!
答案 1 :(得分:1)
我认为,由于as
关键字用于投射,因此您需要此行:
var button:MovieClip = event.target as MovieClip;
blueGradient
似乎是变量名,而不是类名。