[지디넷코리아]대신증권의 차세대시스템 개통 이후 2개월이 지났다. 대신증권 차세대시스템은 증권업계 최초로 주문체결을 제외한 전 영역을 기업용 자바 모듈(J2EE) 기반으로 구현, 화제를 모았다.

 

대신증권 이전 차세대시스템을 개발한 증권사는 물론이고 이후 개발에 착수한 증권사도 자바는 '속도가 느리다', '검증이 안됐다'는 이유로 쉽사리 J2EE를 채택하지 못하고 있다.

 

8일 대신증권 김병철 상무는 그러나 "지금까지는 자바로 구현한 기능도 만족할만한 속도가 나고 있다"고 말했다.

 

김 상무는 "자바를 기반으로 개발한다고 하자 증권업계 뿐만 아니라 IT업계까지 우려가 있었단 것을 알고 있다"며 "하지만 자바가 매년 배 이상이 성능향상을 보이고 있으며 대신증권에서도 만족할 만한 성능을 보였다"고 강조했다.

 

대신증권은 주문조회 기반이 자바다. 주문조회는 체결만큼은 아니지만 속도가 중요하다. 시세정보를 실시간으로 확인하지 못하면 주문을 할 때 손해를 볼 수 있다는 견해다.

 

웹트레이딩시스템(WTS)이 홈트레이딩시스템(HTS)에 비해 많이 사용되지 않는 이유 중 하나도 조회화면의 속도 때문이란 분석도 있다.

 

대신증권은 주문조회 속도가 이전 시스템에 비해 2배 이상 빨라졌다고 강조하고 있다.

 

김 상무는 "자바를 기반으로 시스템을 구현했을 때 속도가 느리다는 것은 아마도 구현해보지 않았기 때문일 것"이라고 말했다. 예상했던 것보다는 훨씬 만족스럽게 결론이 났다.

 

김 상무는 "컴포넌트 기반의 자바로 시스템을 구현한 이후 개발속도가 오히려 빨라질 것"이라며 "조만간 출시할 HTS 등에서도 톡톡히 효과를 볼 것"이라고 설명했다.

 

대 신증권은 차세대시스템 개발 끝내고 안정화 기간 3개월을 거치기도 전에 HTS 차기 버전 등 그동안 미뤄왔던 프로젝트에 착수한다. 이외에도 대신증권은 자본시장통합법에 대응한 소액결제, 선물시스템과 컴플라이언스에 대응하는 국제회계기준(IFRS)시스템 등도 구축한다.

 

특히 이번달부터는 기획부터 시작할 차기HTS는 대신증권이 2년마다 대폭 손질해 내놓는 HTS다. 대신증권은 그동안 차기HTS를 개발할 때 6개월 이상의 시간을 들였다.

 

김 상무는 "서비스 지향 아키텍처(SOA) 사상을 채용한 자바 기반의 시스템으로 기존 개발에 걸렸던 4~5개월의 기간을 2개월 이내로 단축할 수 있을 것"이라고 말했다.
[지디넷코리아]블리자드엔터테인먼트 측이 올 하반기 출시예정인 스타크래프트2(이하 스타2)를 온라인 멀티플레이 방식으로만 서비스 한다고 밝히자 사용자의 비난이 일고 있다. 일각에서는 온라인 멀티플레이 방식을 고집하는 이유를 두고 배틀넷 유료화 수익 극대화를 위한 준비과정은 아닌지 우려하고 있다.

 

6일 관련업계에 따르면 올 하반기 출시 예정인 RTS 스타2가 전작의 UDP나 IPX 등 LAN 멀티플레이 방식을 없애고 온라인 베틀넷 멀티플레이를 서비스할 계획이다.

 

▲ 배틀넷으로만 멀티플레이가 지원되는 `스타크래프트2`...사용자 불만은 고조되고 있다.

LAN멀티플레이 방식은 기존 스타크래프트에서 적용중이며 인터넷에 연결이 되어 있지 않아도 PC와 PC간 LAN선을 연결해 상대 게임 사용자와 멀티플레이를 즐길 수 있도록 한 게임시스템이다.

 

하지만 블리자드는 이 같은 LAN멀티플레이 방식을 과감히 버렸다. 블리자드 측이 스타2의 멀티플레이 서비스는 온라인 배틀넷 홈페이지를 통해서만 제공한다고 결정한 것이다.

 

국내외 게임 사용자들은 이러한 소식이 전해지자 불만의 목소리를 내고 있다. 블리자드의 서버 관리 능력을 신뢰하지 못할뿐더러 배틀넷 유료화 수익을 극대화하기 위한 일종을 상술로 비춰졌기 때문.

 

무엇보다 일각에서는 전 세계 불황여파로 게임 사용자의 주머니 사정이 좋지 않는 현 상황에 블리자드 측이 무리수를 두는 것은 아닌지 우려의 목소리도 있었다.

 

현재 해외사이트를 중심으로 ‘스타2 LAN 멀티플레이 살리기 서명운동’이 한창이며 이에 국내 게임사용자들도 동조하고 있는 분위기다.

 

이에 앞서 블리자드는 지난해 블리즈컨2008 행사장에서 스타크래프트2를 3부작으로 분할 판매한다고 밝혀 사용자의 볼멘소리를 듣기도 했다. 당시 블리자드의 지나친 상술이라는 비난과 더불어 게임 사용자의 입장을 고려치 않은 대형 외국게임사의 횡포라는 비난이 일었다.

 

한 게임사용자는 “스타크래프트2 LAN멀티플레이 기능 제거는 블리자드 측이 국내 e스포츠 시장과 PC방 시장을 장악해 더욱 큰 수익창출을 노리는 상술”이라며 “블리자드가 우리나라 게임시장을 좌지우지 하는 것을 막으려면 스타크래프트2의 LAN 기능을 부활시켜야 한다”고 주장했다.

'etc > old' 카테고리의 다른 글

[Flex] Font 사용방법 예시  (0) 2009.07.14
대신증권 "차세대 자바 속도 O.K"  (0) 2009.07.09
[AS3.0] Shallow copy 와 Deep copy  (0) 2009.07.07
아이온을 넷북에서 즐긴다?  (0) 2009.07.03
로더 : 다량 이미지 로딩하기  (0) 2009.07.02
[지디넷코리아]앞으로 3D그래픽 카드가 없는 노트북이나 넷북에서도 최신 3D 게임을 즐길 수 있을 것으로 보인다.

 

온라인 PC게임 스트리밍업체 가이카이(Gaikai B.V)는 최근 3D그래픽 카드가 없어도 서버를 이용해 최신 3D게임을 즐길 수 있도록 한 클라우드 컴퓨팅 서비스 '가이카이'(Gaikai)의 데모 동영상을 공개했다.

 

3 일 관련업계에 따르면 '가이카이'(Gaikai)는 3D그래픽 효과를 표현하기 위해 연산 작업을 서버에서 처리, 3D그래픽 카드가 없는 데스크톱이나 노트북에서도 '아이온', '콜오브듀티' 시리즈 등 3D게임을 즐길 수 있게 하는 서비스이다.

 

▲ Gaikai서비스를 이용하면 3D카드가 없는 노트북이나 넷북에서도 최신 3D게임을 즐길 수 있다.

이 서비스를 개발한 데이비드 페리는 자사의 공식 홈페이지를 통해 "이 프로그램은 윈도와 리눅스, 맥 등 모든 OS에 대응하고 있어 전 세계 어떤 컴퓨터 사용자라도 쉽고 편리하게 이용할 수 있다"며 ""이 서비스를 이용하면 성능이 떨어지는 노트북이나 넷북에서도 최신 3D게임을 마음껏 즐길 수 있을 것"이라고 설명했다.

 

이번 데모 동영상에서는 '가이카이'(Gaikai) 전용 브라우저를 통한 3D게임 '월드오브워크래프트'와 '스포처'의 시연 장면이 공개됐다.



만든목적 :
1. 다량의 이미지를 한번에 로딩하자
2. 로딩시 순차적으로 이미지를 보여주자.
3. 프로그래스 바 표현을 해주자

이런 목적으로 제작 했습니다. 사용은 그냥 잘 쓰시면 됩니다.(수정 맘대로 하셔도 됨)

===> 자세한 내용은 첨부 파일을 참조하기 바랍니다.



테스트 이미지 (순차적으로 이미지를 한번에 로딩 할 수 있음 ㅋㅋㅋㅋㅋ)
==> 10 읽어들인 이미지 개수임.



테스트 코드

<?xmlversion="1.0" encoding="utf-8"?>

<mx:Application

       backgroundColor="#ffffff"

       creationComplete="init()"

       xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

       <mx:Script>

             <![CDATA[

                   

                    importmx.controls.Image;

                    importwonsama.info.ImageLoaderInfo;

                    importwonsama.event.ImageLoaderEvent;

                    importwonsama.loader.ImageLoader;

                    importmx.containers.Canvas;

                   

                    /**

                     * 초기화

                     * */

                    private function init():void{

                          

                           //테스트용 이미지 주소 생성 ==> 배열에 삽입

                           var imgArr:Array = new Array;

                           for(var i:uint=0;i<10;i++){

                                 var imgSource:String = "assets/img/number/0"+i+".png";

                                 imgArr.push(imgSource);

                           }

                          

                           //이미지 로더 생성 이벤트 등록

                           var loader:ImageLoader = newImageLoader;

                           loader.loadImages(imgArr);

                           loader.addEventListener(ImageLoaderEvent.UPDATE_PROGRESS,imageProgressHandler);

                           loader.addEventListener(ImageLoaderEvent.COMPLETE_LOAD,imageCompleteHandler);

                    }

                   

                    /**

                     * 이미지가 1 로딩 완료가 되었을 발생하는 이벤트 핸들러

                     * @param e 이미지 로더 이벤트

                     * */

                    private function imageProgressHandler(e:ImageLoaderEvent):void{

                          

                           //일반적으로  프로그래스 처리 내용이 들어가면 될거 같음

                          

                           var info:ImageLoaderInfo = e.info as ImageLoaderInfo;

                           txtInfo.text =String(info.countSuccess);

                    }

                   

                    /**

                     * 이미지가 모두 로딩 완료가 되었을 발생하는 이벤트 핸들러

                     * @param e 이미지 로더 이벤트

                     * */

                    private function imageCompleteHandler(e:ImageLoaderEvent):void{

                          

                           //일반적으로 로딩된 이미지를 보여주는 처리를 하면 될거 같음

                          

                           var info:ImageLoaderInfo = e.info as ImageLoaderInfo;

                          

                           for(var s:String ininfo.loadImgArr){

                                 var imgLoad:Image = info.loadImgArr[s];

                                 if(imgLoad==null){

                                        //기본 이미지 삽입

                                        //main.addChild("기본이미지");

                                 }

                                 else{

                                        main.addChild(imgLoad);

                                 }

                           }                               

                    }

                   

             ]]>

       </mx:Script>

       <mx:Label id="txtInfo"fontFamily="굴림"fontSize="12"/>

       <mx:HBox id="main"width="100%" height="100%"/>

      

</mx:Application>

'etc > old' 카테고리의 다른 글

[AS3.0] Shallow copy 와 Deep copy  (0) 2009.07.07
아이온을 넷북에서 즐긴다?  (0) 2009.07.03
아이폰, '외산폰 무덤인 한국'서 통할까?  (0) 2009.07.02
미리보기 켄버스  (0) 2009.07.01
Fixed Size of a Pie Chart  (0) 2009.07.01
[지디넷코리아]
아이폰, 외산폰의 무덤인 한국에서도 통할까.

 

국내에도 애플 아이폰이 출시된다면 시장의 반응이 어떨까에 대한 각가지 관측이 제기되고 있다.    

 

아 이폰은 지난 2007년 처음으로 공개됐으나 우리나라의 경우 이동통신사업자와의 협상이 원활하게 진행되지 못하면서 출시가 지연되고 있다. 그러나 최근 휴대폰 시장에서 스마트폰의 영향력이 점차 확대되면서, 이용자들 사이에 아이폰 도입 요구가 제기돼 왔다. 이에 따라 KT와 SK텔레콤 등 이통사들이 올 하반기 내 아이폰을 출시할 것이라는 예측에 힘이 실리고 있다.

 

한화증권은 최근 아이폰이 실제 국내에 도입될 경우, 하반기 휴대폰 시장은 전반적인 경쟁완화 속에서 국지적으로 경쟁이 심화될 것이라고 전망했다.

 

박 종수 한화증권 애널리스트는 보고서에서 "KT가 먼저 아이폰을 도입할 경우, 독점공급 기간 동안 최대한 가입자를 모으기 위해 마케팅에 집중할 수 밖에 없고, 경쟁사인 SK텔레콤과 LG텔레콤도 가입자 이탈을 방지하기 위해 고기능성 단말기로 맞대응하면서 일시적으로 경쟁이 심화될 것이다"라고 분석했다.

 

그는 그러나 "KT에 이어 SK텔레콤도 아이폰을 공급할 경우 신규 가입자 유치보다는 기존 가입자 중심으로 가입이 이루어질 것으로 예상돼, 시장은 점차 안정기조로 바뀔 것이다"라고 예상했다.

 

그 는 이어 "만약 KT만 단독으로 아이폰을 공급하게 될 경우에는 경쟁상황이 지속될 것"이라고 분석했으며 "KT가 아이폰을 통해 가입자 유치 효과를 극대화하기 위해 마케팅을 강화할 가능성이 높고, 경쟁사들도 가입자 이탈을 막기 위해 맞대응이 불가피할 것이다"라고 밝혔다.

 

▲ '아이폰 3GS'. 애플이 최근 아이폰 신제품을 발표하면서, 국내에도 도입이 가시화되는 분위기다. 그러나 실제 시장에 끼칠 영향력에 대해서는 의견이 분분하다.

■아이폰 국내 성공여부, 의견 분분

 

국내에 아이폰이 출시될 경우 그 성공여부에 대해서는 의견이 분분하다. 성공을 위해 가장 중요한 요소는 요금제가 일순위에 꼽힌다.

 

이 통사들이 아이폰 판매에 공격적으로 임할 경우 구매가격 및 요금제를 소비자 입맛에 맞는 적정수준으로 구성, 실제 시장에서도 가시적인 영향을 끼칠 것으로 보인다. 업계에서는 이를 위해 구매가격은 10만원대에, 월정액 요금제로 5만원대 이내를 책정한다면 시장 파괴력을 획득할 것으로 분석하고 있다.

 

특히 일본시장에서 아이폰 보급이 실패한 사례는 많은 시사점을 준다. 일본은 지난해 소트프뱅크가 독점으로 아이폰3G를 출시했다.

 

일본에서 아이폰이 실패한 이유는 ▲내수 제조사 영향력이 크고 ▲스마트폰 수준의 고기능폰들이 활성화돼 있으며 ▲아이폰이 일본 사용자가 즐겨 사용하는 기능을 지원하지 않았기 때문으로 분석된다.

 

우 리나라의 경우에도 삼성전자나 LG전자 등 국내 제조사들이 막대한 영향력을 행사하고 있다. 국산 휴대폰 플랫폼인 위피(WIPI)가 폐지되면서 올해 초부터 외산 휴대폰들이 다수 공급되고 있지만 시장에는 별다른 영향력을 끼치지 못하고 있다.

 

국내 제조사들은 특히 스마트폰에 버금가는 다양한 고기능폰을 속속 출시하고 있으며, 막대한 비용을 마케팅에 쏟고 있다. 외산폰이 이런 국내 시장의 틈바구니에서 괄목할 만한 영향력을 행사하기가 쉽지 않은 이유다.

 

이미 휴대폰의 주요 기능으로 일반화된 지상파DMB 등의 기능도 아이폰은 지원하지 않기 때문에, 일부 마니아층 이외 전체 시장에는 예상만큼 영향력을 끼치지 못할 것이라는 분석도 많다.

 

통 신업계 한 관계자는 "이동통신사업자들도 자신의 수익구조를 무너뜨리면서까지 아이폰을 도입해야 하는가에 대해 여전히 고민을 갖고 있는 상황이다"라며 "실제 출시할 때 이를 감수하고 획기적인 가격대와 요금제로 내놓지 않는 이상, 아무리 아이폰이라 해도 그 영향력은 크지 않을 것 같다"고 말했다.

 

'etc > old' 카테고리의 다른 글

아이온을 넷북에서 즐긴다?  (0) 2009.07.03
로더 : 다량 이미지 로딩하기  (0) 2009.07.02
미리보기 켄버스  (0) 2009.07.01
Fixed Size of a Pie Chart  (0) 2009.07.01
[TREE] 트리만들기 - XML바인딩 하지않고 사용하기  (0) 2009.06.30

미리보기 켄버스
=> 켄버스에 조그마한 켄버스가 추가되어 있음
=> 미니 켄버스는 마우스 위치에 따라 4개 위치에 존재하게 됨
=> set previewCanvas 를 통해 미리보기 켄버스 등록가능
=> 사용법 : Canvas에 마우스를 가져가면 조그마한 켄버스가 보이게 됨.
=> 크기조절 : 소스 내부 상수값을 수정하면 됨.

쓸일 있음 수정하셔서 맘대로 ~ 잘 쓰세요~ ^^




사용예)

<?xmlversion="1.0" encoding="utf-8"?>

<mx:Application

       creationComplete="init()"

       xmlns:compo="wonsama.compo.canvas.*"

       xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

       <mx:Script>

             <![CDATA[

                    importmx.containers.Canvas;

                    private function init():void{

                           var myCanvas:Canvas = new Canvas;

                           myCanvas.setStyle("backgroundColor",0xff0000);

                           prev.previewCanvas =myCanvas;

                    }

             ]]>

       </mx:Script>

       <compo:PreViewCanvas id="prev"width="100%" height="100%"/>

</mx:Application>


소스)

package wonsama.compo.canvas

{

 import flash.events.MouseEvent;

 

 import mx.containers.Canvas;

 import mx.core.mx_internal;

 import mx.events.FlexEvent;

 

  public class PreViewCanvas extends Canvas

 {

  /////////////////////////////////////////////////

  //

  // privateconst

  //

  private const LOC_1:uint = 0x01;

  private const LOC_5:uint = 0x11;

  private const LOC_7:uint = 0x10;

  private const LOC_11:uint = 0x00;

 

  private const PREV_SIZE:Number = 0.2; // Range : 0(MIN) ~ 1(MAX)

  private const PREV_GAP:Number = 20;

 

  /////////////////////////////////////////////////

  //

  // privatevariable

  //

  private var _previewCanvas:Canvas;

  private var _width:Number;

  private var _height:Number;

  private var _prePos:Number;

 

  /////////////////////////////////////////////////

  //

  // publicfunction

  //

  public function PreViewCanvas()

  {

   super();

  

  addEventListener(MouseEvent.ROLL_OUT,rollOutHandler);

  addEventListener(MouseEvent.ROLL_OVER,rollOverHandler);

  addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler);

  

  }

 

  /////////////////////////////////////////////////

  //

  // privatefunction

  //

 

 

  /**

   * 현재 위치를 알려준다.

   * @param xPos x좌표

   * @param yPos y좌표

   * @return 위치를 알려준다. LOC_X 참조

   * */

  private function getPos(xPos:Number, yPos:Number):uint{

   var rtn:Number = 0;

  

   if(xPos>=0.5) rtn+=0x01;

   if(yPos>=0.5) rtn+=0x10;

  

   return rtn;

  }

   

  /////////////////////////////////////////////////

  //

  //listener function

  //

 

  private function movePreview(pos:uint):void{

   if(_prePos==pos) return;

  

   switch(pos){

    case LOC_1:

     _previewCanvas.x = PREV_GAP;

     _previewCanvas.y = _height - PREV_GAP -_previewCanvas.height;

    break;

   

    case LOC_5:

     _previewCanvas.x = PREV_GAP;

     _previewCanvas.y = PREV_GAP;

    break;

   

    case LOC_7:

     _previewCanvas.x = _width - PREV_GAP-_previewCanvas.width;

     _previewCanvas.y = PREV_GAP ;

    break;

   

    case LOC_11:

     _previewCanvas.x = _width - PREV_GAP -_previewCanvas.width;

     _previewCanvas.y = _height - PREV_GAP -_previewCanvas.height;

    break;

   }

  

   _prePos = pos;

  }

 

  /**

   * 마우스 핸들러

   * ==> 미리보기 화면 이동시켜주기 

   * @param e 마우스 이벤트

   * */

  private function mouseMoveHandler(e:MouseEvent):void{

   var pos:uint = getPos(e.localX/_width,e.localY/_height);

   movePreview(pos);

  }

   

  private function rollOutHandler(e:MouseEvent):void{

   _previewCanvas.visible = false;

  }

  private function rollOverHandler(e:MouseEvent):void{

   _previewCanvas.visible = true;  

  }

 

 

  /////////////////////////////////////////////////

  //

  // get /set function

  //

 

  public function get previewCanvas():Canvas{

   return _previewCanvas;

  }

 

  public function set previewCanvas(value:Canvas):void{

       this.removeAllChildren();

       this.addChild(value);

       value.visible= false;

   this._previewCanvas = value;

  }

 

  /////////////////////////////////////////////////

  //

  //override function

  //

 

  override protected function createChildren():void{

   super.createChildren();

  

   //테스트용 Canvas 생성하여 준다.

   if(!_previewCanvas){

    _previewCanvas = new Canvas;

    _previewCanvas.visible = false;

    _previewCanvas.setStyle("backgroundColor",0x87D741);

    this.addChild(_previewCanvas);       

   }

  

  }

   

  override protected function updateDisplayList(unscaledWidth:Number,unscaledHeight:Number):void{

  

   super.updateDisplayList(unscaledWidth,unscaledHeight);

  

   _width = unscaledWidth;

   _height = unscaledHeight;  

  

   _previewCanvas.width = this.unscaledWidth * PREV_SIZE;

   _previewCanvas.height = this.unscaledHeight * PREV_SIZE;

  

   trace(_previewCanvas);

  }

 }

}

Answer :

The only thing I was able to find for this, should anyone else run into this problem, is to make the chart more narrow compared to its height. I had been hoping for a way to explicitly control the pie radius, but I just can't seem to find that.

Why?
The callout lines have a little tick mark at the end of them that points toward the middle of the circle. If they happen to fall near the bottom or the top of the chart, they force the pie area to be smaller. But if you make the whole chart more narrow, the size of the pie becomes limited by the sides, instead of the top and bottom. Since you CAN limit the length of the callout labels, you can control the distance between circle and the side edge of the chart, and thus ensure that the circle always has the same radius.

나 ?

음 ... 이글을 찾게 된 이유는...

이미지
------   => 요렇게 차트 위에 이미지 넣으려 했는데..
차트

결론은 비율이 맞지 않음 -_-; 위 글을 보아하니 원 밖에 영역에 Label 같은 놈들이 영역을 차지하고 있어 그런거 같은데.. 아놔....


출처 : http://www.actionscript.org/forums/showthread.php3?t=176165
XML을 사용하지 않고서 트리를 만드는 방법을 소개 합니다. XML쓰면 가끔가다 뭐시기한것이 있어서리 ...


package wonsama.util.tree

{

       import mx.collections.ArrayCollection;

      

       public class TreeNode

       {

             public var id:int;               //아이디

             public var name:String;          //이름

             public var type:int;             //타입

            

//부모노드

             public var parent:TreeNode;     

             //자식노드 집합체

             [Bindable] public var children:ArrayCollection;            

                          

             /**

              * 자식을 추가한다.

              * ==> 자식을 추가하는 동시 해당 자식의 부모가 설정된다

              * @param node 추가하려는 자식

              * */

             public function addChild(node:TreeNode):void{

                    if(this.children == null){

                           this.children = new ArrayCollection;

                    }     

                    node.parent = this;

                    children.addItem(node);                

             }

            

             public function toString():String{

                    return name;

             }

       }

}


이런 식으로 클래스를 만들어서 Tree에 바인딩하여 사용하면 됩니다.

여기서 중요한 것은 children 이라는 변수명은 절대로 변경해서는 안됩니다. !!!!


[ Flex3 Tree Help 참조내용 ]

an Object class data provider must have all children in <code>children</code> fields.


- Test Code


private function createTree():void{

       var root:TreeNode = new TreeNode;

       root.name = "호드종족";

      

       var c1:TreeNode = new TreeNode;

       c1.name = "오크";

       var c2:TreeNode = new TreeNode;

       c2.name = "타우렌";

       var c3:TreeNode = new TreeNode;

       c3.name = "블러드엘프";

      

       root.addChild(c1);

       root.addChild(c2);

       root.addChild(c3);

      

       myTree.dataProvider = root;

}


<mx:Tree id="myTree" />

어디에서 퍼왔는지는 기억이 잘 안나는데 Adobe사이트였나 -_-;

하여간 유용하게 잘 사용하시기 바랍니다. 한글주석부분만 제가 추가한 부분임 -_-;

약간 수정하여 사용하시면 다양하게 확장하여 사용 할 수 있습니다.


아래 코드를 나름 요약하여 설명하자면....
현재 커서의 위치를 얻어와 Point 에 저장한 다음 그것 기준으로 차트를 드로잉 해주는 것입니다. -_-/
그리고 중요 메소드는 updateDisplayList()입니다. 화면의 변화가 발생하는 경우 동작하는 메소드임.
참조로 Flex Help에서는  :  Drawing programmatically 을 검색하여 보면 그리기 방법을 이해 할 수 있습니다.


사용 방법 해당 랜더러를 annotationElements 에 추가 시켜주면 됩니다.

예시)

<mx:annotationElements>    <!--차트 위 드로잉 (강조)-->
<comp:RangeSelector />
</mx:annotationElements>

이런식으로 ^^;

package

{

    importflash.display.*;

    importflash.events.*;

    importflash.geom.*;

   

   

    importmx.charts.chartClasses.*;

    importmx.controls.*;

   

    public class RangeSelector extendsChartElement {

 

 

             private const TEXT_COLOR:uint = 0xFFE635;

 

             private const BOX_RANGE_THICKNESS:uint = 2;

             private const BOX_RANGE_COLOR:uint = 0xFFE635;

 

             private const BOX_BG_COLOR:uint = 0xB6FF37;

             private const BOX_BG_ALPHA:Number = 0.2;

             private const BOX_LINE_COLOR:uint = 0x518200;

             private const BOX_LINE_THICKNESS:uint = 2;

            

             private const LINE_COLOR:uint = 0xffffff;

             private const LINE_THICKNESS:uint = 3;

             private const LINE_ALPHA:Number = 0.5;

   

        /* the bounds of the selected region*/

        private var dLeft:Number = 20;

        private var dTop:Number = 20;

        private var dRight:Number = 80;

        private var dBottom:Number = 80;

 

        /* the x/y coordinates of the start of the trackingregion */

        private var tX:Number;

        private var tY:Number;

 

        /* whether or not a region is selected */

        private var bSet:Boolean = false;

 

        /* whether or not we're currently tracking */       

        private var bTracking:Boolean = false;

 

        /* the current position of the crosshairs */

        private var _crosshairs:Point;

       

        /* the four labels for the data bounds of the selectedregion */

        private var _labelLeft:Label;

        private var _labelRight:Label;

        private var _labelTop:Label;

        private var _labelBottom:Label;

       

        /* constructor */

        public function RangeSelector():void

        {

            super();

            setStyle("color",0);

            /* mousedowns are where we start tracking the selection*/

            //addEventListener("mouseDown",startTracking);

       

            /* mousemove and rollout are used to track the crosshairs*/

            addEventListener("mouseMove",updateCrosshairs);

            addEventListener("rollOut",removeCrosshairs);

           

            /* create our labels */

            _labelLeft = new Label();

            _labelTop = new Label();

            _labelRight = new Label();

            _labelBottom = new Label();

           

            _labelLeft.setStyle("color",TEXT_COLOR);

            _labelTop.setStyle("color",TEXT_COLOR);

            _labelRight.setStyle("color",TEXT_COLOR);

            _labelBottom.setStyle("color",TEXT_COLOR);

                        

            addChild(_labelLeft);

            addChild(_labelTop);

            addChild(_labelRight);

            addChild(_labelBottom);

           

           

        }

 

        /* draw the overlay */

        override protected function updateDisplayList(unscaledWidth:Number,

                                                  unscaledHeight:Number):void

        {

 

            super.updateDisplayList(unscaledWidth,unscaledHeight);

           

 

            var g:Graphics= graphics;

            g.clear();

           

            // draw a big transparent square so the flash player seesus for mouse events */

            g.moveTo(0,0);

            g.lineStyle(0,0,0);

            g.beginFill(0,0);

            g.drawRect(0,0,unscaledWidth,unscaledHeight);

            g.endFill();

 

            /* draw the crosshairs. Crosshairs are drawn where themouse is, only when the mouse is over us, so we don't need to transform

            *   to data coordinates

            */

            if(_crosshairs!= null)

            {

               g.lineStyle(LINE_THICKNESS,LINE_COLOR,LINE_ALPHA);

 

                g.moveTo(0,_crosshairs.y);

               g.lineTo(unscaledWidth,_crosshairs.y);

 

                g.moveTo(_crosshairs.x,0);

               g.lineTo(_crosshairs.x,unscaledHeight);

               

                //내가 추가한거 - 네모상자 그려주기

                varR_SIZE:Number = 8;

                var R_BG:uint =0xff0000;

                varR_ALPHA:Number = 1;

                 var R_LINETHICK:Number = 2;

                 var R_LINECOLOR:uint = 0xffffff;                   

               g.lineStyle(R_LINETHICK,R_LINECOLOR,R_ALPHA);

                g.beginFill(R_BG,R_ALPHA);

               g.drawRect(_crosshairs.x-R_SIZE/2, _crosshairs.y-R_SIZE/2,R_SIZE,R_SIZE);         

                g.endFill();

               

            }

           

            /* draw the selected region, if there is one */

            if(bSet)

            {

                /* the selection is a data selection, so we want to makesure the region stays correct as the chart changes size and/or ranges.

                *  so we store it in data coordaintes. So beforewe draw it, we need to transform it back into screen coordaintes

                */

                var c:Array =[{dx: dLeft, dy: dTop}, {dx:dRight, dy: dBottom}];

                dataTransform.transformCache(c,"dx","x","dy","y");

 

                /* now draw the region on screen */

                g.moveTo(c[0].x,c[0].y);                

               g.beginFill(BOX_BG_COLOR,BOX_BG_ALPHA);

               g.lineStyle(BOX_LINE_THICKNESS,BOX_LINE_COLOR);

                g.drawRect(c[0].x,c[0].y,c[1].x- c[0].x, c[1].y - c[0].y);

                g.endFill();

 

 

                /* now we're going to draw the decorators indicating thebottom and right edges of the box

                */

               g.lineStyle(BOX_RANGE_THICKNESS,BOX_RANGE_COLOR);

               

                // draw bottom line

                g.moveTo(c[0].x,c[1].y + 9);

                g.lineTo(c[0].x,c[1].y + 15);

                g.moveTo(c[0].x,c[1].y + 12);

                g.lineTo(c[1].x,c[1].y + 12);

                g.moveTo(c[1].x,c[1].y + 9);

                g.lineTo(c[1].x,c[1].y + 15);

                

                // draw right line

                g.moveTo(c[1].x + 9,c[0].y);

                g.lineTo(c[1].x + 15,c[0].y);

                g.moveTo(c[1].x + 12,c[0].y);

                g.lineTo(c[1].x + 12,c[1].y);

                g.moveTo(c[1].x + 9,c[1].y);

                g.lineTo(c[1].x + 15,c[1].y);

 

                /* now we're going to position the labels at the edges ofthe box */

                _labelLeft.visible =_labelRight.visible = _labelTop.visible = _labelBottom.visible = true;

               _labelLeft.setActualSize(_labelLeft.measuredWidth,_labelLeft.measuredHeight);

                _labelLeft.move(c[0].x -_labelLeft.width/2,c[1].y + 24);

               _labelRight.setActualSize(_labelRight.measuredWidth,_labelRight.measuredHeight);

                _labelRight.move(c[1].x -_labelRight.width/2,c[1].y + 24 );

               _labelTop.setActualSize(_labelTop.measuredWidth,_labelTop.measuredHeight);

                _labelTop.move(c[1].x +24,c[0].y - _labelTop.height/2);

               _labelBottom.setActualSize(_labelBottom.measuredWidth,_labelBottom.measuredHeight);

                _labelBottom.move(c[1].x +24,c[1].y - _labelBottom.height/2);

 

            } else {

                _labelLeft.visible =_labelRight.visible = _labelTop.visible = _labelBottom.visible = false;               

            }

        }

 

 

        /* to make sure we end up in any ranges autogenerated bythe axes, we need to describe our data to them

        */

        override public functiondescribeData(dimension:String,requiredFields:uint):Array

        {

            /* if no region is selected, we have no data */

            if(bSet == false)

                return [];

           

            vardd:DataDescription = new DataDescription();

           

           

            if (dimension== CartesianTransform.HORIZONTAL_AXIS) {

                /* describe the minimum and maximum values we need onscreen */

                dd.min = dLeft;

                dd.max = dRight;

           

               

                if((requiredFields& DataDescription.REQUIRED_BOUNDED_VALUES) != 0)

                {

                    /* since we don't want our labels sticking off the edgeof the chart, we need to ask for 'bounded values' around the selected data.

                    *  a bounded value is a pixel margin to theleft/right of a specific data point. In this case, we'll ask for the width ofour labels

                    */

                    dd.boundedValues = [

                        new BoundedValue(dLeft),

                        new BoundedValue(dRight,_labelLeft.width/2,24 +Math.max(_labelLeft.width,_labelRight.width))

                    ]

                }

            }

            else {

                dd.min = dBottom;

                dd.max = dTop;

                if((requiredFields& DataDescription.REQUIRED_BOUNDED_VALUES) != 0)

                {

                    /* since we don't want our labels sticking off the edgeof the chart, we need to ask for 'bounded values' around the selected data.

                    *  a bounded value is a pixel margin to thetop/bottom of a specific data point. In this case, we'll ask for the height ofour labels

                    */

                    dd.boundedValues = [

                        new BoundedValue(dTop),

                        new BoundedValue(dBottom,24 +Math.max(_labelLeft.height,_labelRight.height,_labelTop.height/2))

                    ]

                }

            }

           

            return [dd];

        }

 

        override protected function commitProperties():void

        {   

            super.commitProperties();

           

 

            /* when our data changes, we need to update the textdisplayed in our labels */

//            _labelLeft.text =Math.round(dLeft).toString();

//            _labelRight.text =Math.round(dRight).toString();

           

           

                          

                    varstartTime:Date = new Date;

                    varendTime:Date = new Date;

                    startTime.setTime(dLeft);

                    startTime.setTime(dRight);

                   

                    var hh1:uint =startTime.getHours();

                    var mm1:uint =startTime.getMinutes();

                    var ss1:uint =startTime.getSeconds();

                    var hh2:uint =endTime.getHours();

                    var mm2:uint =endTime.getMinutes();

                    var ss2:uint =endTime.getSeconds();

                          

            _labelLeft.text = zeroSpace(hh1)+":"+zeroSpace(mm1)+":"+zeroSpace(ss1);

            _labelRight.text = zeroSpace(hh2)+":"+zeroSpace(mm2)+":"+zeroSpace(ss2);

           

            _labelTop.text =Math.round(dTop).toString();

            _labelBottom.text =Math.round(dBottom).toString();

           

        }

 

                    private function zeroSpace(num:uint, space:uint=2,word:String="0"):String{

                           var tmpLen:uint = space - String(num).length;

                           var tmpStr:String="";

                           for(var i:uint=0;i<tmpLen;i++){

                                 tmpStr+="0";

                           }

                           return tmpStr+num;

                    }

 

        override public function mappingChanged():void

        {

            /* since we store our selection in data coordinates, weneed to redraw when the mapping between data coordinates and screen coordinateschanges

            */

            invalidateDisplayList();

        }

 

        private function startTracking(e:MouseEvent) :void

        {

            /* the user clicked the mouse down. First, we need to addlisteners for the mouse dragging */

            bTracking = true;

            parentApplication.addEventListener("mouseUp",endTracking,true);

            parentApplication.addEventListener("mouseMove",track,true);

 

            /* now store off the data values where the user clickedthe mouse */

            vardataVals:Array = dataTransform.invertTransform(mouseX,mouseY);

            tX = dataVals[0];

            tY = dataVals[1];

            bSet = false;

 

            updateTrackBounds(dataVals);

        }

 

        private function track(e:MouseEvent):void {

            if(bTracking== false)

                return;

            bSet = true;

           updateTrackBounds(dataTransform.invertTransform(mouseX,mouseY));

            e.stopPropagation();

        }

 

        private function endTracking(e:MouseEvent):void

        {

            /* the selection is complete, so remove our listeners andupdate one last time to match the final position of the mouse */

            bTracking = false;

           parentApplication.removeEventListener("mouseUp",endTracking,true);

           parentApplication.removeEventListener("mouseMove",track,true);

            e.stopPropagation();

           updateTrackBounds(dataTransform.invertTransform(mouseX,mouseY));

        }

 

        private function updateCrosshairs(e:MouseEvent):void

        {

            /* the mouse moved over the chart, so grab the mousecoordaintes and redraw */

            _crosshairs = new Point(mouseX,mouseY);

            invalidateDisplayList();

        }

        private function removeCrosshairs(e:MouseEvent):void

        {

            /* the mouse left the chart area, so throw away anystored coordinates and redraw */

            _crosshairs = null;

            invalidateDisplayList();

        }

        private function updateTrackBounds(dataVals:Array):void

        {

            /* store the bounding rectangle of the selection, in anormalized data-based rectangle */

            dRight = Math.max(tX,dataVals[0]);

            dLeft = Math.min(tX,dataVals[0]);

            dBottom = Math.min(tY,dataVals[1]);

            dTop = Math.max(tY,dataVals[1]);

 

            /* invalidate our data, and redraw */

            dataChanged();

            invalidateProperties();

            invalidateDisplayList();

           

        }

       

    }

}

+ Recent posts