Programa não responder quando eu adiciono lona em função enterFrame
-
06-07-2019 - |
Pergunta
Eu tenho vindo a fazer uma aplicação simples e eu tenho um problema que eu não posso encontrar a solução (nem por que está acontecendo)
A coisa que eu quero fazer é adicionar dinamicamente uma tela contendo um botão para o aplicativo e, em seguida, eu quero a tela para ser movido a partir do lado esquerdo da tela para a direita.
Então, eu fiz o seguinte 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>
E ele funciona muito bem. O próximo passo é em vez de usar os Canvas eu uso uma lona feita sob encomenda .. aqui é o 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>
então eu alterar a seguinte linha de código
var ccanvas:Canvas = new Canvas()
to
var ccanvas:CustomCanvas = new CustomCanvas();
O resultado é que não há nenhuma tela exibida na tela ... o programa não faz nada ....
A coisa mais estranha é que, se eu não tenho uma função onEnterFrame e eu só adicionar minha tela personalizada para o método init () é sido exibidos corretamente. Mesmo se eu tiver um onEnterFrame, mas sem alterar o valor x das customCanvas que está sendo exibido corretamente. Mas o momento em que escrevo no
onEnterFunction o ccanvas.x código + = 1 o programa does not exibir qualquer coisa .... Mas se eu fizer isso com o objeto original da lona é tudo ok ,,,
O que está acontecendo aqui? Como eu posso fazer um objeto lona feita sob encomenda e, em seguida, ser capaz de movê-lo em um método onEnterFrame?
Obrigado !!!!!!
Solução
problema pouco agradável. Parece que o processo de criação do componente está sendo curto-circuito de alguma forma, embora para ser honesto, eu não sei exatamente como.
No entanto, à espera dos CustomCanvas para despachar um evento creationComplete antes de tentar agir sobre suas propriedades de exibição (o que é uma boa prática, de qualquer maneira) corrige o problema. Veja abaixo, modificado para adicionar o ouvinte para creationComplete, e esperar até que o ouvinte é chamado para adicionar o 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 verdade seja dita, porém, eu não tenho certeza qual é a diferença entre um mx: Canvas e seus derivados CustomCanvas neste caso, em termos de tempo; talvez alguém poderia dialogar sobre esse. Mas espero que a solução vai ser útil para você, e, novamente, é boa prática para Flex fazer a sua coisa componente de ciclo de vida antes de tentar trabalhar com seus componentes.
Espero que ajude!