Enterframe 함수에 캔버스를 추가 할 때 프로그램이 응답하지 않습니다.

StackOverflow https://stackoverflow.com/questions/1614050

문제

나는 간단한 응용 프로그램을 만들었고 문제가 있습니다. 해결책을 찾을 수 없습니다 (왜 그런 일이 일어나고 있는지 모두).

내가하고 싶은 것은 응용 프로그램에 버튼이 포함 된 캔버스를 동적으로 추가 한 다음 캔버스가 화면의 왼쪽에서 오른쪽으로 이동하기를 원합니다.

그래서 나는 다음 코드를 만들었습니다

  <?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>

그리고 그것은 잘 작동합니다. 다음 단계는 캔버스를 사용하는 대신 사용자 정의 캔버스를 사용하는 것입니다. 여기에 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>

그런 다음 다음 코드 라인을 변경합니다

  var ccanvas:Canvas = new Canvas()  

      to

  var ccanvas:CustomCanvas = new CustomCanvas();

결과적으로 화면에 캔버스가 표시되지 않습니다 ... 프로그램은 아무것도하지 않습니다 ....

가장 이상한 점은 oneNTerFrame 함수가없고 init () 메소드에 사용자 정의 캔버스를 추가하면 올바르게 표시된다는 것입니다. OnEnterFrame이 있지만 CustomCanvas의 X 값을 변경하지 않고도 올바르게 표시됩니다. 그러나 내가 쓰는 순간

OnEnterFunction 코드 ccanvas.x += 1 프로그램에 아무것도 표시되지 않습니다 .... 그러나 원래 Canvas 객체로 그렇게하면 모두 괜찮습니다.

여기서 무슨 일이 일어나고 있습니까? 사용자 정의 캔버스 객체를 만드는 방법은 OnEnterframe 메소드로 이동할 수 있습니까?

고맙습니다!!!!!!

도움이 되었습니까?

해결책

좋은 작은 문제. 구성 요소 생성 프로세스가 어떻게 든 단락 된 것처럼 보이지만 솔직히 말하지만 정확히 어떻게 확실하지 않습니다.

그럼에도 불구하고, CustomCanvas가 디스플레이 속성 (좋은 관행)에서 행동하려고 시도하기 전에 CommunityCanvas가 CreationComplete 이벤트를 파견하기를 기다리는 것은 문제를 해결합니다. 아래를 참조하십시오. 수정 된 청취자를 CreationComplete에 추가하고 리스너가 Enterframelistener를 추가하도록 요청 될 때까지 기다립니다.

<?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 : Canvas와 파생 된 CustomCanvas의 차이가 무엇인지 잘 모르겠습니다. 어쩌면 누군가가 그 일에 차임 할 수있을 것입니다. 그러나 솔루션이 나중에 유용 할 것이며, 구성 요소와 함께 작업하기 전에 구성 요소 리프 시클을 수행하는 것이 좋습니다.

도움이되기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top