Программа не отвечает, когда я добавляю холст на функцию enterFrame - PullRequest
0 голосов
/ 23 октября 2009

Я подал простую заявку, и у меня возникла проблема. Я не могу найти решение (и почему это происходит)

Я хочу динамически добавить холст, содержащий кнопку, в приложение, а затем я хочу, чтобы холст перемещался с левой стороны экрана вправо.

Итак, я сделал следующий код

  <?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, но без изменения значения x в customCanvas, оно отображается правильно. Но в тот момент, когда я пишу в

onEnterFunction, код ccanvas.x + = 1, программа ничего не отображает .... Но если я сделаю это с исходным объектом Canvas, все будет в порядке ,,,

Что здесь происходит? Как я могу сделать пользовательский объект холста, а затем быть в состоянии переместить его в методе onEnterFrame?

Спасибо !!!!!!

1 Ответ

1 голос
/ 23 октября 2009

Хорошая маленькая проблема. Похоже, процесс создания компонента как-то замыкается, хотя, если честно, я не совсем уверен, как.

Тем не менее, ожидание, пока CustomCanvas отправит событие 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 в этом случае с точки зрения времени; Может быть, кто-то может вмешаться в это. Но, надеюсь, решение окажется полезным для вас, и опять же, хорошей практикой является то, чтобы Flex выполнил свою задачу, связанную с жизненным циклом компонентов, прежде чем пытаться работать с его компонентами.

Надеюсь, это поможет!

...