2009-10-23 6 views
0

J'ai fait simple aplication et j'ai un problème que je ne peux pas trouver la solution (ni pourquoi cela se produit)programme ne répond pas quand j'ajoute la toile sur la fonction enterFrame

La chose que je veux faire est pour ajouter dynamiquement un canevas contenant un bouton à l'application, puis je souhaite que le canevas soit déplacé du côté gauche de l'écran vers la droite.

j'ai donc fait le code suivant

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

Et ça fonctionne très bien. La prochaine étape est au lieu d'utiliser la toile i utiliser une toile personnalisée .. est ici le composant 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> 

alors je change la ligne de code suivant

var ccanvas:Canvas = new Canvas() 

     to 

    var ccanvas:CustomCanvas = new CustomCanvas(); 

le résultat est que il n'y a aucune toile affichée à l'écran ... le programme ne fait rien ...

la chose la plus étrange est que si je n'ai pas de fonction onEnterFrame et que j'ajoute juste ma toile personnalisée à l'init() méthode, il a été affiché correctement. Même si j'ai un onEnterFrame mais sans modifier la valeur x de customCanvas, il est affiché correctement. Mais le moment où je vous écris dans le

onEnterFunction le code ccanvas.x + = 1 le programme ne marche pas afficher quoi que ce soit .... Mais si je le fais avec l'objet de toile d'origine, il est tout ok ,,,

Que se passe-t-il ici? comment puis-je faire un objet canvas personnalisé et ensuite être en mesure de le déplacer dans une méthode onEnterFrame?

Merci !!!!!!

Répondre

1

Joli petit problème. Il semble que le processus de création de composants soit en quelque sorte court-circuité, bien que, pour être honnête, je ne suis pas exactement sûr de la façon dont. Néanmoins, attendre que le CustomCanvas envoie un événement creationComplete avant de tenter d'agir sur ses propriétés d'affichage (ce qui est une bonne pratique, quoi qu'il en soit) résout le problème. Voir ci-dessous, modifié pour ajouter l'auditeur pour creationComplete, et attendre jusqu'à ce que l'auditeur est appelé à ajouter le 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> 

À vrai dire, cependant, je ne suis pas sûr de ce que la différence entre un mx: Canvas et votre CustomCanvas dérivé dans ce cas, en termes de timing; Peut-être que quelqu'un pourrait intervenir sur celui-là. Mais j'espère que la solution sera utile pour vous, et encore une fois, c'est une bonne pratique pour Flex de faire son cycle de vie composant-composant avant d'essayer de travailler avec ses composants.

J'espère que ça aide!

+0

vous avez raison de la méthode de création complète ajoutée dans le canevas personnalisé .. cela fonctionne! Maintenant, je dois comprendre comment je vais modifier mon code principal ... parce que dans mon programme principal onEnterFrame doit être appelé indépendamment de la toile car il a d'autres composants à déplacer aussi .. et aussi le canvas personnalisé est créé dans un certain point après que le programme a commencé dans un temps aléatoire. Et encore plus je ne crée pas un objet de toile personnalisée mais beaucoup et quand ils vont sur l'écran je les enlève juste ... bien coclusion "mxml est comme une belle femme avec un mauvais caractère" ... coller à as3 :) – Pitelk

+0

Merci beaucoup pour votre réponse utile! – Pitelk

+0

+1 Mais encore une fois, quelle est la différence? – Amarghosh

Questions connexes