Pregunta

He estado haciendo una aplicación simple y tengo un problema, no puedo encontrar la solución (ni por qué está sucediendo)

Lo que quiero hacer es agregar dinámicamente un lienzo que contenga un botón a la aplicación y luego quiero que el lienzo se mueva desde el lado izquierdo de la pantalla hacia la derecha.

Así que he hecho el siguiente código

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

Y funciona bien. El siguiente paso es, en lugar de usar el lienzo, uso un lienzo personalizado. Aquí está el componente 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>

luego cambio la siguiente línea de código

  var ccanvas:Canvas = new Canvas()  

      to

  var ccanvas:CustomCanvas = new CustomCanvas();

el resultado es que no se muestra ningún lienzo en la pantalla ... el programa no hace nada ...

lo más extraño es que si no tengo una función onEnterFrame y simplemente agrego mi lienzo personalizado al método init (), se muestra correctamente. Incluso si tengo un onEnterFrame pero sin cambiar el valor x de customCanvas, se muestra correctamente. Pero el momento en que escribo en el

onEnterFunction el código ccanvas.x + = 1 el programa no muestra nada ... Pero si lo hago con el objeto Canvas original, todo está bien ,,,

¿Qué está pasando aquí? ¿Cómo puedo hacer un objeto de lienzo personalizado y luego moverlo en un método onEnterFrame?

Gracias !!!!!!

¿Fue útil?

Solución

Pequeño problema agradable. Parece que el proceso de creación de componentes se está cortocircuitando de alguna manera, aunque para ser honesto, no estoy exactamente seguro de cómo.

Sin embargo, esperar a que CustomCanvas envíe un evento creationComplete antes de intentar actuar sobre sus propiedades de visualización (lo que es una buena práctica, de todos modos) soluciona el problema. Vea a continuación, modificado para agregar el agente de escucha para creationComplete, y espere hasta que se llame a ese agente para agregar el 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>

A decir verdad, no estoy seguro de cuál es la diferencia entre un mx: Canvas y sus CustomCanvas derivados en este caso, en términos de tiempo; tal vez alguien podría estar de acuerdo con eso. Pero esperemos que la solución le resulte útil, y una vez más, es una buena práctica hacer que Flex haga su tarea en el ciclo de vida de los componentes antes de intentar trabajar con sus componentes.

Espero que ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top