동적으로 생성 된 버튼을 제공하는 방법 각각에 대한 동작 조치 - 2 부
-
13-09-2019 - |
문제
안녕하세요 다시 동료 플래시 :)
StackoverFlow에서 여기에 위치한 첫 번째 질문은이 문제를 다루었 고, 몇 가지 다른 버튼을 만든 배열이있었습니다. 그러나 나는 그들에게 행동을 할당하는 방법을 몰랐다.동적으로 생성 된 버튼을 제공하는 방법 각각에 대한 동작 조치 - 1 부
감사합니다 Joel Hooks, 나는 내 코드를 작동시킬 수 있었다. 그러나 이번에는 가져 오기 그래픽을 내 라이브러리에서 클래스로 사용하는 대신 그라디언트*(JPG를 가져올 필요가 없음)을 그려서 MovieClip을 만들었습니다. 이제 나는 또 다른 두려움을 느끼고 있습니다 "시간 상수를 컴파일하지 않음" 다시 오류. 나는 그것이 클릭하거나 롤링되는 버튼 인스턴스를 결정하려는 방식과 관련이 있다고 생각합니다.
이전 버튼 생성 (일하고 있는) 암호:
for (var i : number = 0; i <myxmlarray.length; i ++) {navbutton = new Navbutton; navbutton.name = "button" + i; navbutton.x = i * navsize; navbutton.y = avbtny; Navbutton.buttonmode = true; Thumbsmov.addchild (Navbutton);
buttons.push (Navbutton); 버튼 [i] .adeventListener (mouseevent.mouse_up, handleButtonClick); 버튼 [i] .adeventListener (mouseevent.roll_over, handleButtonover); 버튼 [i] .adeventListener (mouseevent.roll_out, handleButtonoff); }
이전 청취자 (일하고 있는) 암호:
function handleButtonOver(event:MouseEvent):void {
var 버튼 : navbutton = event.target as navbutton; var id : number = number (button.name.split ( "버튼")1); if (button) tweenlite.to (buttonRolls [id], .4, {alpha : 1, eason : strong.easout}); 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;
그것이 Compile Time Constant Error가 나타나게하는 원인이기 때문입니다. 그러나 해당 라인을 제거하면 모든 버튼은 Button0과 Button1이라는 2 개의 버튼 대신 Button1입니다.
여기서 도움이나 포인터는 대단히 감사 할 것입니다! 내 코드를 살펴 보셔서 미리 감사드립니다.
해결책
나는 이후로 as
키워드는 캐스팅을위한 것입니다. 대신이 라인을 원합니다.
var button:MovieClip = event.target as MovieClip;
blueGradient
클래스 이름이 아닌 변수 이름 인 것 같습니다.
다른 팁
문제는 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"이라고 말하지만 새 버전에서는 "button.name.split ..."대신 "bluegradient.name.split ..."을 작성합니다. if () 문의.
VAR 키워드는 객체의 이름을 정의합니다. 구문은 var [ObjectName] : [ObjectType]이며, 해당 객체로 작업 할 때는 항상 유형이 아닌 이름으로 이름으로 참조하고 싶습니다. 정적 메소드가있는 정적 클래스가 없다면 조금 더 발전합니다.
간단히 말해서 : 새 핸들러의 두 곳에서 "Bluegradient"를 "버튼"으로 바꾸면 문제가 해결되어야합니다. 도움이 되었기를 바랍니다!