2009-10-23 1 views
0

나는 간단한 aplication를 만들어왔다에 캔버스를 추가 할 때 응답하지 않습니다와 나는 문제 (이 일어나는 이유도) 내가 해결책을 찾을 수 없습니다프로그램은 내가를 enterFrame 기능

내가하고 싶은 일이있다 동적으로 단추를 포함하는 캔버스를 응용 프로그램에 추가 한 다음 캔버스를 화면의 왼쪽에서 오른쪽으로 옮기고 싶습니다.

그래서 나는 다음과 같은 코드
<?xml version="1.0" encoding="utf-8"?> 
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
    creationComplete="init()"> 

<mx:Script> 
    <![CDATA[ 
     import mx.containers.Canvas; 
     import mx.controls.Button; 

     var ccanvas:Canvas = new Canvas(); 
     var canvasButton:Button = new Button(); 

     public function init():void{ 
      canvasButton.label="canvas Button"; 
      ccanvas.x=100; 
      ccanvas.y=200; 
      ccanvas.addChild(canvasButton); 
      addChild(ccanvas); 

      addEventListener(Event.ENTER_FRAME, onEnterFrame); 

     } 

     public function onEnterFrame(event:Event):void{ 
      ccanvas.x+=1; 
     } 

    ]]> 
</mx:Script> 


</mx:Application> 

만들었습니다 그리고 그것은 잘 작동합니다. 다음 단계 대신 캔버스 나 맞춤 캔버스를 사용하여하다 .. 여기서 나는 결과이다

var ccanvas:Canvas = new Canvas() 

     to 

    var ccanvas:CustomCanvas = new CustomCanvas(); 

다음의 코드 라인을 변경 후 CustomCanvas.mxml 성분

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300"> 
    <mx:Button label="ccccButton" /> 
</mx:Canvas> 

인 화면에 표시되는 캔바스가 없습니다. 프로그램이 아무 것도하지 않습니다. ...

가장 이상한 것은 onEnterFrame 함수가 없으면 그냥 init에 사용자 정의 캔버스를 추가하는 것입니다.() 메소드는 제대로 표시됩니다. onEnterFrame을 가지고 있지만 customCanvas의 x 값을 변경하지 않아도 제대로 표시됩니다. 그러나 그 순간 나는 코드 ccanvas.x + = 1 아무 것도 표시 나던 프로그램 onEnterFunction

에 쓰기 ....하지만 난 원래 캔버스 객체 그렇게 할 경우 모든 확인 ,,,

입니다 여기서 무슨 일이 일어나고있는거야? 어떻게 캔버스 객체를 만들고 나서 onEnterFrame 메서드로 이동할 수 있습니까?

감사합니다 !!!!!!

답변

1

좋은 작은 문제. 솔직히 말해서 구성 요소 작성 프로세스가 어떻게 든 단락되어있는 것처럼 보입니다. 정확히 어떻게 확신 할 수는 없지만.

그럼에도 불구하고, CustomCanvas가 (어쨌든, 좋은 연습이다)의 디스플레이 등록 정보에 따라 행동을 시도하기 전에 creationComplete 이벤트를 파견 기다리고 문제를 해결합니다.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> 

<mx:Script> 
    <![CDATA[ 

    import mx.events.FlexEvent; 
    import mx.containers.Canvas; 
    import mx.controls.Button; 

    private var ccanvas:CustomCanvas = new CustomCanvas(); 
    private var canvasButton:Button = new Button(); 

    public function init():void 
    { 
    canvasButton.label="canvas Button"; 
    ccanvas.x = 100; 
    ccanvas.y = 200; 
    ccanvas.addChild(canvasButton); 

    ccanvas.addEventListener(FlexEvent.CREATION_COMPLETE, ccanvas_creationComplete); 
    addChild(ccanvas); 
    } 

    private function ccanvas_creationComplete(event:FlexEvent):void 
    { 
    addEventListener(Event.ENTER_FRAME, onEnterFrame); 
    } 

    public function onEnterFrame(event:Event):void 
    { 
    ccanvas.x += 1; 
    } 

    ]]> 
</mx:Script> 

</mx:Application> 

진실을 말 할,하지만, 내가 차이는 MX 사이에 무엇인지 확실하지 않다 :의 creationComplete에 대한 리스너를 추가하도록 수정하고, 기다리는 그 리스너가 enterFramelistener을 추가 호출되는 때까지 아래를 참조 캔버스를 이 경우 파생 된 CustomCanvas를 타이밍 측면에서 볼 수 있습니다. 어쩌면 누군가가 그걸 꼽을 수 있습니다. 그러나 솔루션이 나중에 유용하게 사용될 수 있기를 바랍니다. Flex는 구성 요소로 작업하기 전에 구성 요소 라이프 사이클을 수행하는 것이 좋습니다.

희망이 있습니다.

+0

는 사용자 정의 캔버스에 추가 된 창조 완전한 방법에 대한 권리이다 .. 그것은 작동! 이제 내 주 코드를 변경하는 방법을 알아 내야 만합니다. 메인 프로그램에서 onEnterFrame이 indepedently 캔버스에서 호출되어야합니다. 왜냐하면 다른 요소도 이동해야하기 때문이며 또한 사용자 정의 캔버스가 프로그램이 임의의 시간에 시작된 후 어떤 지점. 그리고 더는 내가 정의 캔버스하지만 중 하나 개 객체를 생성 그나마 그들이 화면을 통해 갈 때 난 그냥 AS3에 충실 ... 잘 coclusion "MXML 나쁜 문자를 가진 아름 다운 여자 같다".... 제거 :) – Pitelk

+0

도움이되는 답변을 주셔서 감사합니다. – Pitelk

+0

+1하지만 다시, 차이점은 무엇입니까? – Amarghosh