Enterframe 함수에 캔버스를 추가 할 때 프로그램이 응답하지 않습니다.
-
06-07-2019 - |
문제
나는 간단한 응용 프로그램을 만들었고 문제가 있습니다. 해결책을 찾을 수 없습니다 (왜 그런 일이 일어나고 있는지 모두).
내가하고 싶은 것은 응용 프로그램에 버튼이 포함 된 캔버스를 동적으로 추가 한 다음 캔버스가 화면의 왼쪽에서 오른쪽으로 이동하기를 원합니다.
그래서 나는 다음 코드를 만들었습니다
<?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의 차이가 무엇인지 잘 모르겠습니다. 어쩌면 누군가가 그 일에 차임 할 수있을 것입니다. 그러나 솔루션이 나중에 유용 할 것이며, 구성 요소와 함께 작업하기 전에 구성 요소 리프 시클을 수행하는 것이 좋습니다.
도움이되기를 바랍니다!