HTML 문서내에 SWF와 JavaScript는 ExternalInterfacecalladdCallback 메소드를 이용하면 통신할 수 있다. ExternalInterface.addCallback( "myMethod", myMethod);로 정의하면 JavaScript에서 SWF의 myMethod를 호출할 수 있게 된다. myMethod가 function myMethod( params:Object ); 형태로 만들었다면 JavaScript에서 만든 {a:1, b:2}와 같은 값이 전달될 수 있다. 당연한거다.

AIR 1.5.3 환경에서 HTMLLoader 클래스를 이용해 위처럼 정의된 HTML 문서를 로드한다고 하자. 이 때는 Object값을 JavaScript에서 SWF내에 정의된 myMethod로 넘길 수 없다. String이나 Number 형태의 값이라면 상관없지만 Object는 안된다. 버그다. 결국 Object의 형태를 띈 String을 넘겨주고 그 String을 다시 SWF내에서 Object로 변환해주어야 한다. 이것을 구현하기 위해 json.js을 사용했지만 JSON객체를 찾을 수 없다며 에러를 던진다. 그래서 Prototype의 Object.toJSON을 이용했다. 물론 ActionScript쪽에서는 as3corelib에 있는 JSON 클래스를 활용하면 된다. String과 Object형태의 String을 어떻게 구분할지 묻는다면 try..catch 문을 활용하면 된다고 답변하고 싶다.

이 때문에 엄청 삽질하게 생겼다. ExternalInterface.call() 메소드의 두번째 인자가 ...arguments 형태라는 것을 감안하고 만들었다면 이런 고생 안했을텐데... 

글쓴이: 지돌스타(http://blog.jidolstar.com


지난 2009년 12월 18일에 프로젝트 코드명 Squiggly(스퀴글리)가 Prerelease판으로 업데이트 되었다.
http://labs.adobe.com/technologies/squiggly/

Squiggly는 Flash Player 10, AIR 1.5이상에서 동작한다. 이 엔진은 ActionScript 3.0 기반이며 영어로 문장에서 사용된 단어를 영어사전의 그것과 비교하여 단어의 철자를 체크한다. 이번 업데이트는 TLF(Adobe Text Layout Framework)를 기반으로 하는 Flex 4 Spark 컴포넌트를 지원하도록 했다. Squiggly는 Flex Builder, Flash Builder, Flash CS4등 다양한 툴에서 사용할 수 있다. 단지 아쉬운 것은 영어단어만 체크한다는 점이다.


다음 페이지는 Squiggly 데모이다.
http://labs.adobe.com/technologies/squiggly/demo/

개발자는 언제든지 예제소스와 ASDoc을 아래 링크에서 받아볼 수 있다.


이것을 쓸지 모르겠지만 아무튼 알아두고 있어 나쁠 것도 없으니....

참고
http://adnaru.com/242

글쓴이 : 지돌스타(http://blog.jidolstar.com/640)

 

어제 Adobe AIR에서 CPU 사용을 줄이는 방법에 대해서 소개했다. 이 글에 Hika님과 찬익님이 그에 대해 댓글을 달아주시며 다른 정보를 공유해주셨다. 정말 감사드린다. 이런 것이 블로그의 매력일 것이다. 블로그를 내 완벽한 지식을 전달하기 위해 쓴다는 것은 다소 어폐가 있다. 완벽한 것은 없다. 블로그는 지식 소통의 도구로 잘 활용하면 좋은 정보 공유를 통한 더욱 완전해지는 지식습득이 가능하게 한다. 난 지난 몇년간 블로그를 하면서 정말 몸소 체험했다. 지금 이글을 보고 있는 분들도 꼭 블로그를 하길 권장한다.

각설하고. 찬익님이 Flex 4 기반에서 AIR 애플리케이션을 만들때 FrameRate를 조절하는 방법으로 backgroundFrameRate를 소개해주었다. 이것은 Event.ACTIVATE와 Event.DEACTIVATE를 이용해서 이미 Flex 4의
WindowedApplication 클래스에 적용되어 있다. 아래 코드는 WindowedApplication 클래스의 일부이다.

/**
*  Constructor.
*  
*  @langversion 3.0
*  @playerversion AIR 1.5
*  @productversion Flex 4
*/
public function WindowedApplication()
{
	super();

	addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
	addEventListener(FlexEvent.PREINITIALIZE, preinitializeHandler);
	addEventListener(FlexEvent.UPDATE_COMPLETE, updateComplete_handler);
	addEventListener(FlexEvent.CREATION_COMPLETE, creationCompleteHandler);

	var nativeApplication:NativeApplication = NativeApplication.nativeApplication;
	nativeApplication.addEventListener(Event.ACTIVATE, nativeApplication_activateHandler);
	nativeApplication.addEventListener(Event.DEACTIVATE, nativeApplication_deactivateHandler);
	nativeApplication.addEventListener(Event.NETWORK_CHANGE, dispatchEvent);

	nativeApplication.addEventListener(InvokeEvent.INVOKE, nativeApplication_invokeHandler);
	initialInvokes = new Array();

	//Force DragManager to instantiate so that it can handle drags from
	//outside the app.
	DragManager.isDragging;
}

/**
*  @private
*  Storage for the backgroundFrameRate property.
*/
private var _backgroundFrameRate:Number = 1;

/**
*  Specifies the frame rate to use when the application is inactive.
*  When set to -1, no background frame rate throttling occurs.
*
*  @default 1
*  
*  @langversion 3.0
*  @playerversion AIR 1.5
*  @productversion Flex 4
*/
public function get backgroundFrameRate():Number
{
	return _backgroundFrameRate;
}

/**
*  @private
*/ 
public function set backgroundFrameRate(frameRate:Number):void
{
	_backgroundFrameRate = frameRate;
}

/**
*  @private
*/
private function nativeApplication_activateHandler(event:Event):void
{
	dispatchEvent(new AIREvent(AIREvent.APPLICATION_ACTIVATE));

	// Restore throttled framerate if appropriate when application is activated.
	if (prevActiveFrameRate >= 0 && stage)
	{
	    stage.frameRate = prevActiveFrameRate;  
	    prevActiveFrameRate = -1;
	}
}

/**
*  @private
*/
private function nativeApplication_deactivateHandler(event:Event):void
{
	dispatchEvent(new AIREvent(AIREvent.APPLICATION_DEACTIVATE));

	// Throttle framerate if appropriate when application is deactivated.
	// Ensure we've received an updateComplete on the chance our layout
	// manager is using phased instantiation (we don't wish to store a
	// maxed out (1000fps) framerate).
	if ((_backgroundFrameRate >= 0) && (ucCount > 0) && stage)
	{
	    prevActiveFrameRate = stage.frameRate;
	    stage.frameRate = _backgroundFrameRate; 
	}
}


이는 Flex 4를 이용해 AIR 애플리케이션을 만들때 별도의 조치없이 backgroundFrameRate 속성 설정만으로 frameRate를 조절할 수 있다. 이 값은 기본으로 1이다. 더 좋은 값은 0.01이라고 한다. 이는 거의 멈추게 하는 수준이다. 이 속성은 Flex 4에서 AIR를 위해 WindowedApplication 에만 적용되어 있다. Flash기반인 Application 클래스에는 이 속성이 없다.
참고글
Adobe AIR에서 CPU 사용을 줄이는 방법

글쓴이 : 지돌스타(http://blog.jidolstar.com/624)

+ Recent posts