전에 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 을 리스너거는겁니다.