탄성을 갖고 움직이게 하는 플래시 함수
// 무비클립을 탄력적으로 움직이게 하는 메서드
// a는 -2부터 2사이의 실수 (-2<a<2)
// b는 -1부터 0사이의 실수(-1<b<0)
// a*a+4b는 -4부터 0사이의 실수(-4<a*a+4b<0)
// b가 -1에 가까울수록 진동폭이 큼
// a가 -2에 가까울수록(작을수록) 속도가 빠름
// tx와 ty는 이동할 최종 위치
MovieClip.prototype.elasticMove = function(a, b, tx, ty){
var tempx = this._x;
var tempy = this._y;
this._x = a*(this._x - tx) + b*(this.prevx - tx) + tx;
this._y = a*(this._y - ty) + b*(this.prevy - ty) + ty;
this.prevx = tempx;
this.prevy = tempy;
};
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
flash player 설치 관련 (0) | 2013.01.22 |
---|---|
actionscript 유용한 라이브러리 (0) | 2012.05.31 |
두 지점사이의 거리를 구하는 메서드 공식 (0) | 2012.05.30 |
특정 지점을 바라보게 하기위한 각도를 구하는 메서드 공식 (0) | 2012.05.30 |
BorderContainer image background 활용 (0) | 2011.08.24 |
특정지점으로 부드럽게 움직이는 메서드 공식
// 부드러운 움직임
MovieClip.prototype.smoothMove = function(speed, targetx, targety){
this._x += speed*(targetx - this._x);
this._y += speed*(targety - this._y);
};
_root.무비클립인스턴스.smoothMove(0.2, _xmouse, _ymouse);
'DEVELOPMENT > IOS' 카테고리의 다른 글
아이폰 OS 개발 자료 총정리 (0) | 2012.05.17 |
---|---|
iPhone용 Open Source 모음 (0) | 2012.05.17 |
두 지점사이의 거리를 구하는 메서드 공식
// (x1, y1)에서 (x2, y2)까지의 거리를 구해서 정수값을 반환하는 함수
function distance(x1, y1, x2, y2) {
var diffX = x2-x1;
var diffY = y2-y1;
var r = Math.sqrt(diffX*diffX+diffY*diffY);
return r;
}
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
actionscript 유용한 라이브러리 (0) | 2012.05.31 |
---|---|
탄성을 갖고 움직이게 하는 플래시 함수 (0) | 2012.05.30 |
특정 지점을 바라보게 하기위한 각도를 구하는 메서드 공식 (0) | 2012.05.30 |
BorderContainer image background 활용 (0) | 2011.08.24 |
FlashVars 사용법 (0) | 2011.08.24 |
특정 지점을 바라보게 하기위한 각도를 구하는 메서드 공식
// 무비클립을 (targetx, targety)로 회전시키는 함수
MovieClip.prototype.rotateTo = function(targetx, targety){
var diffX = targetx - this._x;
var diffY = targety - this._y;
this._rotation = Math.atan2(diffY, diffX)*180/Math.PI;
};
_root.무비클립인스턴스.rotateTo(this._xmouse, this._ymouse);
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
탄성을 갖고 움직이게 하는 플래시 함수 (0) | 2012.05.30 |
---|---|
두 지점사이의 거리를 구하는 메서드 공식 (0) | 2012.05.30 |
BorderContainer image background 활용 (0) | 2011.08.24 |
FlashVars 사용법 (0) | 2011.08.24 |
flashBuilder 4.5 plug-in의 메뉴가 한글로 나올때 해결법 (0) | 2011.06.23 |
BitmapData를 PNG나 JPG로 변환하여 ByteArray로 서버에 전송하는 방법
로컬자원을 서버에 전송하기 위해 우리는 FileReference Class를 사용하면 된다.
FileReference로 파일을 서버에 전송하는 방법은 많이 공개가 되어 있다.
알다시피 FileReference의 browse()함수를 호출한 뒤, select 이벤트가 발생시 upload() 함수를 이용하여 선택한 로컬자원을 서버로 보낸다.
서버에서는 아주 단순하게 서버 임시 저장소에 저장된 파일을 원하는 곳에 복사하기만 하면 된다.
php의 경우 move_uploaded_file() 메소드를 사용하면 되겠다.
그럼 Flex 시행도중 캡쳐한 화면을 저장하는 경우에도 위와 같은 방법으로 저장이 가능할까?
나는 예전에 ImageSnapshot 클래스를 이용해 base64로 변환해서 서버로 전송한 뒤에 base64를 decode하여 저장하는 방법에 대해서 언급한적이 있다. (http://blog.jidolstar.com/301 참고)
이 방법의 단점은 이미지가 큰 경우 base64로 encode, decode 하는 과정에서 서버성능 및 클라이언트 성능에 따라 속도 및 부하에 영향을 준다. 그러므로 이 방법으로는 PNGEncoder 및 JPGEncoder로 PNG, JPG 파일 형식에 맞는 데이타를 만들었다고 해도, FileReference와 같이 데이타를 전송을 할 수 없었다.
하지만 Google을 열심히 돌아다녔다니 이 문제점에 대한 해결의 실마리를 찾을 수 있었다.
(역시 Google!!!)
간단히 방법을 요약하자면
화면을 BitmapData로 만들어 PNGEncoder나 JPGEncoder를 이용하여 encode한 다음, 그 결과값인 byteArray값을 서버에 전송한다. 전송된 데이타는 FileReference에서 upload()을 이용해 보낸 파일을 저장할때와 동일하게 저장하면 되겠다.
1. BitmapData로 캡쳐해라.
아래 target은 캡쳐할 UIComponent와 같은 DisplayObject 객체이다.
단, BitmapData를 이용해서 화면을 캡쳐할 대상이 외부 동영상이나 사진같은 거라면 crossdomain.xml 에 대한 check가 있어야 한다. 컨텐츠 로드시 checkPolicyFile 속성을 true로 설정할 필요가 있겠다.
그리고 2880px 이상의 크기는 BitmapData로 만들 수 없다.
2. JPG나 PNG로 Encode 하여 ByteArray를 얻는다.
Flex 3 SDK에는 mx.graphics.codec 패키지에 JPGEncoder와 PNGEncoder가 있다. 인터넷을 뒤져보면 GIFEncoder등도 있을것이다. Flex 2 환경에서 작업한다면 Google code에 Adobe AS3 Corelib에 이들이 제공된다. 만약 JPGEncoder를 사용한다면 다음과 같이 하면 되겠다.
Flex 3 SDK는 이러한 Encoder가 IImageEncoder로 구현되었다. 필요하다면 언제 어디서나 Encoder를 바꿔야 하는 경우 IImageEncoder를 사용하는 것이 좋을 수 있겠다.
가령 아래 예제처럼 말이다.
3. 서버에 ByteArray를 전송한다.
데이타를 전송할때는 FileReference를 사용하지 않는다.
바로 URLLoader와 URLRequest만 이용해서 전송이 가능하다. 참고 데이타는 POST방식으로 URLVariable을 이용해서 보낼 수 있다.
위에 진한 부분에 대한 클래스는 아래에 정의되어 있다. 당신은 이 클래스가 어떻게 구성되었는가 열심히 공부할 필요가 없다.(원한다면 해도 된다. 말리지 않음 ^^)
한가지 중요한 정보를 언급하겠다.
URLLoader를 이용해 서버에 전송할때, 프로그램이 같은 도메인상에 있는 경우에는 보안문제가 없다. 하지만 다른 도메인에 위치한 서버로 이미지를 전송할때는 반드시 crossdomain.xml을 check해야한다.
1. Security.loadPolicyFile(http://다른도메인/crossdomain.xml); 를 URLLoader의 load()함수를 호출하기 전에 호출한다.
2. Flash Player 9.0.124.0 버전부터는 HTTP Header 보안취약점을 해결하기 위해서 cross domain 정책이 변경되었는데.... 서버측에 있는 crossdomain.xml에 allow-http-request-headers-from가 추가되어져야 한다. 이것은 HTTP 헤더 전송을 허용할지 결정해준다.
위 처럼 서버측 crossdomain.xml에 allow-http-request-headers-from을 추가함으로 다른 도메인간에 HTTP 헤더 전송을 허용할 수 있다.
서로 다른 도메인에 SWF와 서버측 코드가 배치되어 있다면 반드시 이 사실을 숙지하길 바란다.
3. Flash Player 10에서는 사용자 인터렉션이 반드시 필요하다.
다음글을 참고하세요.
4. 서버측 코드 작성
만약 위 3번 코드에서 var parameters:URLVariables를 아래와 같이 작성했다고 하자.
그럼 PHP 코드로 아래와 같은 방법처럼 만들면 되겠다.(테스트는 안해봤음)
마지막 save Comple 메시지를 받기 위해서는 Flex의 Complete 이벤트 발생시 아래와 같은 방법으로 받으면 되겠다. 이것을 알아내는데도 많이 힘들었다. 일종의 팁이다. ^^;
글쓴이 : 지돌스타(http://blog.jidolstar.com/352)
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
FlashVars 사용법 (0) | 2011.08.24 |
---|---|
flashBuilder 4.5 plug-in의 메뉴가 한글로 나올때 해결법 (0) | 2011.06.23 |
air를 이용한 SQLlite 사용하기 (0) | 2011.01.13 |
Flex DataGrid Tooltip dataTipFunction Example (0) | 2010.11.11 |
[Flex] flex Image, bitmap등의 결과물을 인쇄 및 저장하기 (0) | 2010.08.25 |
air를 이용한 SQLlite 사용하기
var dbFile : File = File.desktopDirectory.resolvePath("application.db");
//table생성
var conn:SQLConnection = new SQLConnection(); //DB를 연결합니다..
conn.open(dbFile);
var syntax:String = "CREATE TABLE IF NOT EXISTS testTable (" +
"no INTEGER PRIMARY KEY AUTOINCREMENT," +
"title TEXT," +
"url TEXT" +
")";
sendQuery(conn, syntax);
//스키마 정보 확인
try {
conn.loadSchema();
var schemaResult:SQLSchemaResult = conn.getSchemaResult();
if (schemaResult) {
for(var obj:String in schemaResult.tables){
var table:SQLTableSchema = schemaResult.tables[obj] as SQLTableSchema;
log("[" + table.name + "] 스키마(Schema)");
for(var prop:String in table.columns){
var column:SQLColumnSchema = table.columns[prop] as SQLColumnSchema;
log("name:" + column.name + ",dataType:" + column.dataType + ",primaryKey:" + column.primaryKey + ",allowNull:" + column.allowNull + ",autoIncrement:" + column.autoIncrement + ",defaultCollationType:" + column.defaultCollationType);
}
}
}
} catch(e:Error) {
log("테이블이 없습니다.");
}
//등록
syntax = "INSERT INTO testTable (title, url) VALUES ('Adobe AIR Devpia.', 'http://airdev.tistory.com/')"; //no는 자동으로 증가
sendQuery(conn, syntax);
syntax = "INSERT INTO testTable (title, url) VALUES ('아폴로케이션[Apollocation]', 'http://cafe.naver.com/apollocation')"; //no는 자동으로 증가
sendQuery(conn, syntax);
//조회
var syntax:String = "SELECT * FROM testTable";
var responder:Responder = new Responder(
function(e:SQLResult):void {
var result:Array = e.data;
var numRows:int = result.length;
for(var i:int = 0; i < numRows; i++){
log("필드 번호 :" + i);
for(var columnName:String in result[i]){
log(columnName + " :" + result[i][columnName]);
}
}
}
);
sendQuery(conn, syntax, -1, responder);
//DB 삭제
syntax = "DROP TABLE testTable";
sendQuery(conn, syntax);
private function sendQuery(conn:SQLConnection, syntax:String, prefetch:int=-1, responder:Responder=null):void { //쿼리 실행
var stm:SQLStatement = new SQLStatement();
stm.sqlConnection = conn;
stm.text = syntax;
stm.execute(prefetch, responder); //prefetch : 가져올 데이터 개수(-1이면 모두), responder : 결과, 상태 Responder
}
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
flashBuilder 4.5 plug-in의 메뉴가 한글로 나올때 해결법 (0) | 2011.06.23 |
---|---|
BitmapData를 PNG나 JPG로 변환하여 ByteArray로 서버에 전송하는 방법 (0) | 2011.01.13 |
Flex DataGrid Tooltip dataTipFunction Example (0) | 2010.11.11 |
[Flex] flex Image, bitmap등의 결과물을 인쇄 및 저장하기 (0) | 2010.08.25 |
[FLEX] Flex 상에서 stage가 null 일경우 (0) | 2010.08.20 |
[flex] shp 확장자를 가진 해안선 자료 보여주기 예제
참고 사이트
http://dreamingwell.com/articles/archives/2008/06/viewing_shapefi.php
http://earthobservatory.nasa.gov/Features/BlueMarble/
http://code.google.com/p/vanrijkom-flashlibs/
http://vanrijkom.org/wordpress/?p=38
http://www.cdc.gov/epiinfo/maps.htm
http://www.mapcruzin.com/
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
[Flex] Flex Default Background Color (0) | 2010.08.17 |
---|---|
[AS3] BitmapData 사용시 퍼포먼스 향상하는법 (0) | 2010.07.23 |
[actionscript 3.0] 외부 xml 및 txt 파일 읽기 (0) | 2010.07.07 |
Bindable 메타 데이터 태그 (0) | 2010.06.18 |
Event 메타데이터 태그 (0) | 2010.06.18 |
[actionscript 3.0] 외부 xml 및 txt 파일 읽기
//---------------------------------------------------------------
// xml 형식의 파일을 불러온다.
//----------------------------------------------------------------
var dataRequest:URLRequest = new URLRequest("gshhs_l_data.xml");
urlDataLoader = new URLLoader();
urlDataLoader.addEventListener(Event.COMPLETE, loadDatasXML);
urlDataLoader.load(dataRequest);
//----------------------------------------------------------------
// txt 형식의 파일을 불러온다.
//----------------------------------------------------------------
var requestConfig:URLRequest = new URLRequest("bdy_config.txt");
var loaderConfig:URLLoader = new URLLoader();
loaderConfig.addEventListener(Event.COMPLETE, completeConfigHandler);
loaderConfig.load(requestConfig);
/**
* configXML 설정파일 xml을 셋팅한다.
*/
private function loadDatasXML(e:Event):void
{
//dataXML = new XML(e.target).children();
dataXML = new XML(urlDataLoader.data).children();
//trace(dataXML.length());
//draw();
// todo..
private function completeConfigHandler(e:Event):void
{
var src:String = e.target.data as String;
tempConfigRowArray = src.split("\n");
//mainHeaderConfigRowArray = tempConfigRowArray[0].split(",");
//trace("config row count::" + tempConfigRowArray.length);
//etc. etc.
}
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
[AS3] BitmapData 사용시 퍼포먼스 향상하는법 (0) | 2010.07.23 |
---|---|
[flex] shp 확장자를 가진 해안선 자료 보여주기 예제 (0) | 2010.07.15 |
Bindable 메타 데이터 태그 (0) | 2010.06.18 |
Event 메타데이터 태그 (0) | 2010.06.18 |
Style 메타데이터태그 (0) | 2010.06.18 |
Bindable 메타 데이터 태그
데이터 바인딩식의 소스로서 사용할 수 있는 프롭퍼티를 식별합니다
프로퍼티가 데이터 바인딩식의 소스인 경우, Flex는 소스 프로퍼티의 변경시에 자동적으로 소스 프로퍼티의 값을 행선지 프로퍼티에 카피합니다.
다만, 카피를 실행하는 듯 Flex 에 통지하기 위해서는 [Bindable] 메타데이터태그를 사용해 프로퍼티를 Flex 에 등록해 소스 프로퍼티로부터 이벤트를 송출할 필요가 있습니다.
[Bindable] 메타데이터태그의 문장구조법은 다음과 같습니다.
[Bindable] [Bindable(event="eventname")] |
데이터 바인딩 및 이 메타데이터태그에 대해 자세한 것은,데이터 바인딩을 참조해 주세요.
바인드 가능 프로퍼티 체인의 사용
데이터 바인딩의 소스로서 프로퍼티를 지정하면 그 프로퍼티의 변경 뿐만이 아니라 그 프로퍼티가 포함되는 프로퍼티 체인도 감시됩니다. 행선지 프로퍼티를 포함한 프로퍼티의 체인 전체는 「바인드 가능 프로퍼티 체인」이라고 불립니다.
다음의 예의 firstName.text는 firstName 오브젝트와 그 text 프로퍼티를 포함한 바인드 가능 프로퍼티 체인입니다.
<first>{firstName.text}</first> |
바인드 가능 프로퍼티 체인내의 지정한 프로퍼티가 변경되었을 경우에는 이벤트를 생성할 필요가 있습니다. 프로퍼티가 [Bindable] 메타데이터태그에 의해서 마크 되고 있는 경우는 Flex 컴파일러에 의해서 자동적으로 이벤트가 생성됩니다.
다음의 예는 변수 및 getter 프로퍼티에 대해서 [Bindable] 메타데이터태그를 사용하고 있습니다. 또한 이 예는 dispatchEvent() 함수를 호출하는 방법도 나타내 보이고 있습니다.
[Bindable] public var minFontSize:Number = 5; [Bindable("textChanged")] public function get text():String { return myText; } public function set text(t : String):void { myText = t; dispatchEvent( new Event( "textChanged" ) ); } |
[Bindable] 메타데이터태그로 이벤트명을 생략 했을 경우는 Flex 컴파일러에 의해서 propertyChange라는 이름의 이벤트가 자동적으로 생성되어 송출되기 위해, 프로퍼티를 데이터 바인딩식의 소스로서 사용할 수 있습니다.
또, 오브젝트를 기존의 형태에 캐스트 하는 것에 의해서 오브젝트에 관한 구체적인 정보를 컴파일러에 제공할 필요가 있습니다.
다음의 예에서는,List 컨트롤의 myList 에 Customer 오브젝트가 포함되어 있으므로,selectedItem 프로퍼티는 Customer 오브젝트에 캐스트 됩니다.
<mx:Model id="selectedCustomer"> <customer> <name>{Customer(myList.selectedItem).name}</name> <address>{Customer(myList.selectedItem).address}</address> ... </customer> </mx:Model> |
경우에 따라서는, 바인딩이 의도한 대로 자동적으로 실행되지 않는 것이 있습니다.
다음의 예 처럼, dataProvider 프로퍼티의 아이템 전체를 변경했을 경우 바인딩은 자동적으로는 실행되지 않습니다.
dataProvider[i] = newItem |
또, 다음의 예 처럼, 프로퍼티의 서브 프로퍼티가 [Bindable] 메타데이터를 가지는 경우도 바인딩은 자동적으로는 실행되지 않습니다.
... [Bindable] var temp; // Binding is triggered: temp = new Object(); // Binding is not triggered, because label not a bindable property // of Object: temp.label = foo; ... |
이 코드예에서는 {temp.label} 에 관해서 temp 하지만 Object 인 것이 문제입니다. 이 문제는 다음의 몇개의 방법으로 해결할 수 있습니다.
- Object 의 초기화 사전 처리를 실시합니다.
- ObjectProxy를 temp 에 할당합니다.ObjectProxy 의 프로퍼티는 모두 바인드 가능합니다.
- temp를, 바인드 가능한 label 프로퍼티를 사용하고, 엄밀하게 형태 지정된 오브젝트로 합니다.
UIComponent 클래스의 executeBindings() 메소드는 UIComponent 오브젝트를 행선지로 하는 모든 바인딩을 실행합니다.Repeater 컴퍼넌트를 포함한 모든 컨테이너 및 컨트롤은 UIComponent 클래스를 확장한 것입니다. Container 클래스 및 Repeater 클래스의 executeChildBindings() 메소드는 Container 클래스 또는 Repeater 클래스의 아이 UIComponent 컴퍼넌트를 행선지로 하는 모든 바인딩을 실행합니다. 컨테이너는 모두 Container 클래스를 확장한 것입니다.
이러한 메소드에 의해 의도한 대로 행해지지 않는 바인딩을 실행할 수 있습니다. 변경을 더해도 바인딩이 실행되지 않는 경우에 유저 인터페이스를 갱신하려면 executeChildBindings() 메소드에의 호출등의 코드를 1 행 추가합니다. 다만 executeBindings() 메소드는 바인딩이 자동적으로 실행되지 않는 것을 알 수 있고 있는 경우에게만 사용합니다.
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
[flex] shp 확장자를 가진 해안선 자료 보여주기 예제 (0) | 2010.07.15 |
---|---|
[actionscript 3.0] 외부 xml 및 txt 파일 읽기 (0) | 2010.07.07 |
Event 메타데이터 태그 (0) | 2010.06.18 |
Style 메타데이터태그 (0) | 2010.06.18 |
[Flex] 사용자 컴포넌트 (0) | 2010.06.15 |
Event 메타데이터 태그
이벤트의 MXML 프롭퍼티와 컴퍼넌트가 생성하는 이벤트 오브젝트의 데이터형을 정의하려면 [Event] 메타데이터태그를 사용합니다. [Event] 메타데이터태그는,ActionScript 파일내의 클래스 정의 전, 또는 MXML 파일내의 <mx:Metadata> 블록에 삽입합니다.
커스텀 이벤트의 정의 방법에 대해 자세한 것은,커스텀 이벤트(을)를 참조해 주세요.
[Event] 메타데이터태그의 문장구조법은 다음과 같습니다.
[Event(name="eventName", type="package.eventType")] |
다음의 표에,[Event] 메타데이터태그의 프롭퍼티를 나타냅니다.
프롭퍼티 | 형 | 설명 |
eventName | String | 패키지명을 포함한 이벤트명을 지정합니다. |
eventType | String | 이벤트 오브젝트의 데이터형을 정의하는 클래스를 지정합니다.클래스명은 기본 이벤트 클래스의 Event 또는 Event 클래스의 서브 클래스의 어딘가에 됩니다.클래스명에는 패키지를 포함할 필요가 있습니다. |
다음의 예에서는, 컴퍼넌트를 송출할 수 있는 이벤트로서 myClickEvent 이벤트를 지정해 있습니다.
[Event(name="myClickEvent", type="flash.events.Event")] |
[Event] 메타데이터태그를 사용해 클래스 파일에 이벤트를 지정하지 않고, MXML 안에서 그 이벤트명을 사용하려고 하면 MXML 컴파일러에 의해 에러가 생성됩니다. [Event] 메타데이터태그를 생략 했을 경우에서도 addEventListener() 메소드를 사용하면 컴퍼넌트는 ActionScript 안의 이벤트의 이벤트 청취자를 등록할 수 있습니다.
다음의 예에서는 ActionScript 컴퍼넌트를 송출할 수 있는 이벤트로서 myClickEvent 이벤트를 지정해 있습니다.
[Event(name="myEnableEvent", type="flash.events.Event")] public class MyComponent extends UIComponent { ... } |
다음의 예는 MXML 파일내의 <mx:Metadata> 태그 안의 [Event] 메타데이터태그를 나타내고 있습니다.
<?xml version="1.0"?> <mx:Metadata> .... </mx:TextArea> |
[출처] Event 메타데이터 태그 |작성자 루든
'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글
[actionscript 3.0] 외부 xml 및 txt 파일 읽기 (0) | 2010.07.07 |
---|---|
Bindable 메타 데이터 태그 (0) | 2010.06.18 |
Style 메타데이터태그 (0) | 2010.06.18 |
[Flex] 사용자 컴포넌트 (0) | 2010.06.15 |
BlazeDS 4 출시 (0) | 2010.06.11 |