Flex/AIR/AS3/AIR2009.10.09 14:27


제작툴 : Adobe Flash Builder 4
사용언어 : ActionScript 3.0 & AIR 1.5

미해결 문제
  * 1. USB나 기타 저장장치 자동 인식
  * 2. 스타일 적용
  * 3. 폴더 복사, 이동, 삭제
  * 4. 오른쪽 마우스 버튼 메뉴
  * 5. 로컬 디스크 새로 읽어올시 프로그램 어는 문제 미해결;

작동원리
  * Tree 콤포넌트 확장
  * Renderer 사용
  * 비동기식 폴더내역 검색과 동기식 Local Disk 검색
  * 폴더 아이콘, 선택되었을때 Dot border, Dot line 이미지로 구현
  * 혹시나 모를 다국어 버젼을 위한 내 컴퓨터/로컬 디스크 부분 한글은 public 으로 선언
     - 원본 폴더명을 전부 쓰려고 하였으나 내 컴퓨터/로컬 디스크는 Window OS만 사용하므로 배제
  * Node 간 높이 간격 18px (변경시 코드의 수정과 이미지 수정이 불가피)
  * Font Size 12px (변경시 코드의 수정과 이미지 수정이 불가피)

저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★
Flex/AIR/AS3/Tweener2009.09.04 00:17
TweenMax 는 ActionScript에서 사용되는 Tweener의 기능을 좀더 사용하기 편하고 다양한 효과를 나타낼 수 있게 만든 Tweener입니다. Adobe 사에서 만든 것이 아니라 greensock 이라는 곳에서 만든 tweener인데 사용하기도 편하고 다양한 효과를 나타낼 수 있는 장점이 있습니다.

TweenMax 다운받기 - http://blog.greensock.com/tweenmaxas3/

미리보기


저작자 표시 비영리 변경 금지
신고

'Flex/AIR/AS3 > Tweener' 카테고리의 다른 글

BetweenAS3 Tweener  (0) 2009.11.05
TweenMax 사용하기  (0) 2009.09.04
부드러운 움직임 공식 / 탄성 공식  (0) 2009.09.02
Posted by 코멧'★
Flex/AIR/AS3/Tweener2009.09.02 18:00
1. 부드러운 움직임

이동될 위치 = 현재 위치 + (목표 위치 - 현재 위치) * 속도

2. 탄성 효과

이동 거리 = (목표 위치 - 현재 위치) * 속도 + (이동거리 * 탄성계수)
이동될 위치 = 현재위치 + 이동 거리


※ 속도는 0부터 1사이의 소숫점으로 표현 ( 0 < 속도 < 1)

예제)
package {
	import flash.display.MovieClip;
	import flash.events.*;

	public class MenuAction extends MovieClip {
		private var _mouseXpos:Number;
		private var _oriXpos:Number;
		private var _oriWidth:Number;
		private var _oriHeight:Number;
		private var _targetXpos:Number;
		private var _targetWidth:Number;
		private var _targetHeight:Number;
		
		private var _speed:Number = .9;
		private var _damp:Number = .4;
		
		private var _disXpos:Number = 0;
		private var _disWidth:Number = 0;
		private var _disHeight:Number = 0;
		
		public function MenuAction():void {
			_oriXpos = _targetXpos = x;
			_oriWidth = _targetWidth = width;
			_oriHeight = _targetHeight = height;
			addEventListener(Event.ENTER_FRAME,onEnterFrame);
		}
		
		public function set mouseXpos(value:Number):void {
			_mouseXpos = value;
			
			if (value > x) {
				_targetXpos = _oriXpos-20;
			} else if (value < x) {
				_targetXpos = _oriXpos+20;
			} else {
				_targetWidth = _oriWidth * 1.6;
				_targetHeight = _oriHeight * 1.6;
			}
		}
		
		public function mouseOut():void {
			_targetXpos = _oriXpos;
			_targetWidth = _oriWidth;
			_targetHeight = _oriHeight;
		}
		
		private function onEnterFrame(e:Event):void {
			_disXpos = (_targetXpos-x) * _speed + (_disXpos*_damp);
			_disWidth = (_targetWidth-width) * _speed;
			_disHeight = (_targetHeight-height) * _speed;
			
			x = x + _disXpos;
			width = width + _disWidth;
			height = height + _disHeight;
		}
	}
}
저작자 표시 비영리 변경 금지
신고

'Flex/AIR/AS3 > Tweener' 카테고리의 다른 글

BetweenAS3 Tweener  (0) 2009.11.05
TweenMax 사용하기  (0) 2009.09.04
부드러운 움직임 공식 / 탄성 공식  (0) 2009.09.02
Posted by 코멧'★
Flex/AIR/AS3/Etc2009.09.02 17:50

menu0.addEventListener(MouseEvent.ROLL_OVER, mouseOverEvt);
menu1.addEventListener(MouseEvent.ROLL_OVER, mouseOverEvt);
menu2.addEventListener(MouseEvent.ROLL_OVER, mouseOverEvt);
menu3.addEventListener(MouseEvent.ROLL_OVER, mouseOverEvt);
menu4.addEventListener(MouseEvent.ROLL_OVER, mouseOverEvt);

위와 같은 코딩을 해야할 경우
for (var i:int = 0;i < 5; i++) {
	var mc:MovieClip = this["menu"+i] as MovieClip;
	mc.addEventListener(MouseEvent.ROLL_OVER, mouseOverEvt);
}

와 같이 간단히 표현 할 수 있다.
저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★
Flex/AIR/AS3/Error Code2009.08.31 17:08
warning: unable to bind to property 'isCheck' on class 'Object' (class is not an IEventDispatcher)
위 경고 메세지가 뜰 경우 대처 방법

Bind 된 데이타의 타입이 정확하지 않을 경우 Object 객체에 담아서 대입한다.

[출처] Tong - BlueSky_09님의 Flex/Flash/AIR/As통 http://tong.nate.com/lhs0806/40051251

혹시나 봤을지 모르겠지만, FLEX 실행시에 Debugger 를 걸던지 , flashlog.txt 파일에 떨어지는 저런 경고문구들을
본적이 있을것이다. 없으면...ㅠ_ㅠ 쥐쥐~~~ 
가장 대표적인 예로 저렇게 경고를 뜨게하려면 간단하다. 

===============================================================================
1. ActionScript 부분
=============================================================================== 

private function ResultHandler(event:ResultEvent):void{
    // 조회된 정보를 가져온후 DATA 를 핸들링한다.   
    orginalLists = new ArrayCollection();
    orginalLists = ArrayCollection(event.result);
   
    madeLists = new ArrayCollection();
   
    for(var i:uint = 0; i < orginalLists.length ; i++){
    madeLists.addItem({
      value1:  orginalLists.getItemAt(i).value1,   
      value2:  orginalLists.getItemAt(i).value2,
      value3:  orginalLists.getItemAt(i).value3,
      value4:  orginalLists.getItemAt(i).value4,
      value5:  orginalLists.getItemAt(i).value5,
      isCheck : new Boolean(false)   
    });
    }
  } 

===============================================================================
2. MXML 부분
===============================================================================

<mx:DataGridColumn headerText="FactoryName" dataField="value5">
  <mx:itemRenderer>
    <mx:Component>
      <mx:HBox width="100%" height="100%" backgroundAlpha="0" horizontalScrollPolicy="off" verticalScrollPolicy="off">
      <mx:Script>
      <![CDATA[
     
      import mes.common.utils.ComponentUtils;     
      import mx.controls.ComboBox;
      import mx.events.CloseEvent;
      import mx.controls.Alert;

                         
      public function setComboIndex():void{         
        if(data != null){         
            combo1.selectedIndex = ComponentUtils.getComboIndex(combo1 , String(data.value5));
        }
      }     
      ]]>
      </mx:Script>
      <common:PlantComboBoxRenderer id= "combo1"  change="{data.value5 = combo1.selectedItem.data}">               
      </common:PlantComboBoxRenderer>
      </mx:HBox>
    </mx:Component>
    </mx:itemRenderer>
  </mx:DataGridColumn> 

============================================================================================= 

=> 스크립트 소스부분을 보면 RemoteObject 의 결과 이벤트로서 호출되는 함수란것을 알수있다(?) 
    머 중요한건 아니고, 암튼 잘 보면 result 의 사이즈 만큼 for 문을 돌면서, 새로운 배열에 
    Dynamic 하게 객체를 생성해서 새로운 ArrayCollection 을 만들고 있다. 아래처럼.... 

    for(var i:uint = 0; i < orginalLists.length ; i++){
    madeLists.addItem({
      value1:  orginalLists.getItemAt(i).value1,   
      value2:  orginalLists.getItemAt(i).value2,
      value3:  orginalLists.getItemAt(i).value3,
      value4:  orginalLists.getItemAt(i).value4,
      value5:  orginalLists.getItemAt(i).value5,
      isCheck : new Boolean(false)   
    }); 

    그리고, madeLists 녀석은 [Bindable] 메타 테그로 선언되어져서 MXML 부분에 DataGrid 의 dataProvider 로 
    바인딩 되어있다.(소스의 전체를 긁어다 놓은것이 아니므로 말로써 이해하기 바람~~) 
    다음으로, MXML 부분을 보면, DataGrid 안에 한 칼럼에 ComboBox 를 넣기 위해 itemRenderer 를 사용하여 , 
    inLine 스크립트를 구현하였다. 

    실제 저 소스가 돌아가는 원리를 순서로 표현하면, 

    1. 인라인으로 구현된 ComboBox  가 초기화 되면서, DB 접속을 한다. 
    2. 받아온 결과로 ComboBox 의 dataProvider 에 데이터를 바인딩한다. 
    3. CallBack 함수로 구현된 부모클래스의 setComboIndex() 를 호출한다. 
        - ComboBox 에서 호출하는 상세부분은 위 소스에는 없다. 
    4. ActionScript 부분에서 DataGrid 에 바인딩 해준 값을 가져다가 ComboBox 에 존재하는지 검사한다. 
    5. ComboBox 에 해당 데이터가 있으면 ComboBox 의 selectedIndex 를 선택되어있게 한다. 

-> 즉, DataGrid 안에 ComboBox 를 넣고, 그 초기값을 셋팅하기 위한 삽질이다. (물론 더 좋은 방법도 많으리라 생각한다.) 
그런데, 문제는 저렇게 바인딩 하고 실행하면 아마 위 제목에 뿌려진 경고가 좍좍좍 뿌려질것이다.
이유인즉..(검색과 삽질....)
우리가

 for(var i:uint = 0; i < orginalLists.length ; i++){
    madeLists.addItem({
      value1:  orginalLists.getItemAt(i).value1,   
      value2:  orginalLists.getItemAt(i).value2,
      value3:  orginalLists.getItemAt(i).value3,
      value4:  orginalLists.getItemAt(i).value4,
      value5:  orginalLists.getItemAt(i).value5,
      isCheck : new Boolean(false)   
    }); 

이렇게 집어넣은것이 문제인것이다. DataGrid 에서 바인딩을 해야 하는데, 실제 Object 의 성향을 알지 못한다는것이다.
머 깊게 들어가봐야 머리만 복잡하고, FLEX 접고 싶어질 뿐이라 해결책만 간단하게 설명하자면.......
윗 부분을

for(var i:uint = 0; i < orginalLists.length ; i++){ 
      var objectProxy:ObjectProxy = new ObjectProxy();
      objectProxy.value1 = orginalLists.getItemAt(i).value1;
      objectProxy.value2 = orginalLists.getItemAt(i).value2;
      objectProxy.value3 = orginalLists.getItemAt(i).value3;
      objectProxy.value4 = orginalLists.getItemAt(i).value4;
      objectProxy.value5 = orginalLists.getItemAt(i).value5;
      objectProxy.isCheck = "N"; 

      madeLists.addItem(objectProxy);


이런식으로 바꾸면 만사 OK 라는 것이다. 즉, 바인딩 되는 Object 대해서는 저렇게 선언이 되어져야만
ObjectProxy 라는 녀석이 그 객체를 Tracking 하면서 속성값의 변경이라던가를 감시하는것 같다.
사실 저렇게 안해도 아무 문제는 없다.(구현상)
그런데 깔끔해진 로그 파일을 보면 감탄하리라 생각된다. 앞으로도 저렇게 쓰는 습관을 들이는것이 좋을듯 하다. 

두서가 쓸데없이 길었지만 예제를 보다 적나라하게 설명하고자 나름 길게 삽질 했으니 이해바란다.~
모두 수고~
저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★

티스토리 툴바