전에 as2.0으로 맨든거 converting이긴 하지만,
as3.0으로 만들면서 필요한 요소라던가, 이벤트라던가에 대해
여러가지를 익힐 수 있었네요.
코드 구성은 2.0과 거의 같습니다.
이벤트, 속성, 메서드도 같구요.
다만 문제가 좀 있던건 MouseEvent로 옮겨간 updateAfterEvent() 와, releaseOutSide의 구현이었는데요.
사실 updateAfterEvent()는 MouseEvent로 옮겨간게의미상 맞는거 같구요.
releaseOutside도 버튼에 있는게 아니라 Stage에서 처리하는게 맞는 것 같습니다.
항상 네비같은거 만들때 rollover와 rollout이 겹쳐서 골때린 처리를 해야했죠.
소스는 2.0이랑 거의 같아서 주석으로 처리합니다.
이해안되시는건 질문주세염. 사실 답변드릴 처지도 못되긴 하지만 ^^
이 클래스는 테스트드라이브 클래스입니다. fla의 document에 걸려있습니다.
package {
import flash.display.MovieClip;
import flash.events.Event;
public class SliderTest extends MovieClip
{
private var mySlider:EnfraSlider;
private var simpleSlider:EnfraSlider;
public function SliderTest()
{
mySlider = new EnfraSlider(SetEnfraSlider);
//리스너 등록
mySlider.addEventListener(EnfraSlider.HANDLE_MOVE, move_handler);
mySlider.addEventListener(EnfraSlider.HANDLE_PRESS, press_handler);
mySlider.addEventListener(EnfraSlider.HANDLE_RELEASE, release_handler);
//trace(SetEnfraSlider);
mySlider.max = 10;
mySlider.min = 1;
mySlider.width = 200;
simpleSlider = new EnfraSlider(SetSimpleSlider);
simpleSlider.max = 300;
simpleSlider.min = 0;
simpleSlider.width = 300;
}
private function move_handler(evt:Event)
{
//trace(mySlider.handleX);
}
private function press_handler(evt:Event)
{
//trace(mySlider.handleX);
}
private function release_handler(evt:Event)
{
trace(mySlider.handleX);
}
}
}
슬라이더 두개 맨들어봤어요. 무비클립 Assets 는 fla내에 있구요..
이건 상위클래스구요. 무비클립의 속성 제어를 위해 따로 빼놓은거
package
{
/**
* @author ecj2000
*/
import flash.display.MovieClip;
import flash.events.EventDispatcher;
public class MCProperty extends EventDispatcher
{
// setter/getter
private var __target:MovieClip;
private var __x:Number;
private var __y:Number;
private var __width:Number;
public function MCProperty(mc:MovieClip)
{
target = mc;
}
// 컨트롤마다 생김새가 다르기 때문에 하위에서 구현
protected function setSize(nW:Number):void
{
}
public function set target(mc:MovieClip):void
{
__target = mc;
}
public function get target():MovieClip
{
return __target;
}
public function set x(nx:Number):void
{
__x = x;
target.x = nx;
}
public function get x():Number
{
return target.x;
}
public function set y(ny:Number):void
{
__y = y;
target.y = y;
}
public function get y():Number
{
return target.y;
}
public function set width(nw:Number):void
{
__width = nw;
// 추가 코드 작성
setSize(nw);
}
public function get width():Number
{
return __width;
}
}
}
setSize() 가 private, 내부 메서드라서 protected 를 썼습니다.
다음 코드가 실질적인 클래스네여.
package
{
/**
* @author ecj2000
*
* public 함수 : 없음
*
* events
* HANDLE_PRESS : 핸들이나 바를 눌렀을 경우
* HANDLE_RELEASE : 핸들이나 바에서 마우스를 떼었을 경우
* HANDLE_MOVE : 핸들을 잡고 움직일 경우
*
* setter/getter
* target : 슬라이더 본체
* x : 슬라이더 x좌표
* y : 슬라이더 y좌표
* width : 슬라이더의 가로크기
* min : 범위의 최소값
* max : 범위의 최대값
* handleX : 계산된 핸들의 위치
*
*/
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.display.Stage;
public class EnfraSlider extends MCProperty
{
private var mcSlider:MovieClip;
private var mc_slider_handle:MovieClip;
private var mc_slider_bg:MovieClip;
// 마우스가 눌린 상태인지 여부
private var mousePress:Boolean;
// setter / getter
private var __min:Number;
private var __max:Number;
private var __handleX:Number;
// 이벤트 상수
public static var HANDLE_PRESS:String = "handle_press";
public static var HANDLE_RELEASE:String = "handle_release";
public static var HANDLE_MOVE:String = "handle_move";
public function EnfraSlider(mc:MovieClip)
{
super(mc);
min = 0;
max = 100;
// mc 설정
mcSlider = mc;
mc_slider_handle = mc.mc_slider_handle;
mc_slider_bg = mc.mc_slider_bg;
addSliderMouseEvent();
}
// 슬라이더세트의 리스너 등록
private function addSliderMouseEvent():void
{
mc_slider_handle.addEventListener(MouseEvent.MOUSE_DOWN, handle_press_handler);
mc_slider_handle.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove_handler);
mc_slider_bg.addEventListener(MouseEvent.MOUSE_DOWN, bg_press_handler);
}
// 핸들을 PRESS하면
// stage에 리스너를 걸어 releaseOutsize를 구현한다.
private function handle_press_handler(evt:Event = null):void
{
mousePress = true;
setHandleValue();
var bounds:Rectangle = new Rectangle(0, 0, width-mc_slider_handle.width, 0);
mc_slider_handle.startDrag(false, bounds);
mc_slider_handle.stage.addEventListener(MouseEvent.MOUSE_UP, inStage_up_handler);
mc_slider_handle.stage.addEventListener(MouseEvent.MOUSE_MOVE, inStage_move_handler);
dispatchEvent(new Event(HANDLE_PRESS));
}
// stage에서 마우스를 놓았다면
// stage의 리스너를 지운다.
private function inStage_up_handler(evt:MouseEvent):void
{
mousePress = false;
mc_slider_handle.stopDrag();
evt.updateAfterEvent();
evt.target.removeEventListener(MouseEvent.MOUSE_UP, inStage_up_handler);
evt.target.removeEventListener(MouseEvent.MOUSE_UP, inStage_move_handler);
dispatchEvent(new Event(HANDLE_RELEASE));
}
// stage로 마우스를 빼냈어도 마우스를 떼지 않았다면 부드럽게 움직이게
private function inStage_move_handler(evt:MouseEvent):void
{
evt.updateAfterEvent();
}
// 뻘건 배경을 클릭하면
// 핸들이 따라와 붙는다.
private function bg_press_handler(evt:MouseEvent):void
{
mc_slider_handle.x = target.mouseX - (mc_slider_handle.width/2);
if (mc_slider_handle.x <= 0) mc_slider_handle.x = 0;
if (mc_slider_handle.x + mc_slider_handle.width>= width) mc_slider_handle.x = width - mc_slider_handle.width;
handle_press_handler();
}
// 마우스를 움직이면
// 좌표를 계속 계산한다.
private function mouseMove_handler(evt:MouseEvent):void
{
if (mousePress) {
evt.updateAfterEvent();
setHandleValue();
dispatchEvent(new Event(HANDLE_MOVE));
}
}
// 핸들 위치 설정
private function setHandleValue():void
{
handleX = ((max - min) * mc_slider_handle.x) / (width - mc_slider_handle.width);
handleX = Math.round(handleX + min);
}
// override
protected override function setSize(nW:Number):void
{
mc_slider_bg.scaleX = nW * 0.01;
}
public function set handleX(nx:Number):void
{
__handleX = nx;
}
public function get handleX():Number
{
return __handleX;
}
public function set min(nNum:Number):void
{
__min = nNum;
}
public function get min():Number
{
return __min;
}
public function set max(nNum:Number):void
{
__max = nNum;
}
public function get max():Number
{
return __max;
}
}
}
핵심은 mouse_down 핸들러 내에 stage의 mouse_up 을 리스너거는겁니다.
'IT관련글모음' 카테고리의 다른 글
휴대전화 망내할인 50%는 조삼모사격. 어이는 안드로메다로~ (2) | 2007.09.18 |
---|---|
IT중소기업 한국에서 살아남을 수 있나? (1) | 2007.09.13 |
SNS2.0 적용된 엔플러그(Nplugs)가 뭐지? (0) | 2007.09.11 |
paperVision3D 기초 샘플 (0) | 2007.09.09 |
FreeTransformTool Document (0) | 2007.09.09 |
이 날만 손꼽아 기다리는 중... |
|