AS3 VerticalTrackBarRuler ---- 垂直摄量条

来源:互联网 发布:ug8.0编程视频教程全集 编辑:程序博客网 时间:2024/04/23 19:32

VerticalTrackBarRuler类:

package {/** * 跟踪条的尺寸类 * @author Jave.Lin */public class VerticalTrackBarRuler extends Control{public override function set width(value:Number):void{if(width!=value){_w=value;refreshBackground();}}public override function set height(value:Number):void{if(height!=value){_h=value;refreshBackground();}}public function VerticalTrackBarRuler(){super();}protected override function initialize():void{_w=100;_h=10;refreshBackground();}protected override function refreshBackground():void{this.graphics.clear();this.graphics.lineStyle(.5);this.graphics.beginFill(0,.4);this.graphics.drawRect((width/2-width/8),0,width/4,height);this.graphics.endFill();}}}

VerticalTrackBar类:

package{import controlsEvents.TrackBarEvent;import flash.events.Event;import flash.events.MouseEvent;/** * 垂直跟踪条类(我自己认为是:摄量条) * @author Jave.Lin */public class VerticalTrackBar extends Control{private var _isDrawBorder:Boolean=true;private var _isDrawBackground:Boolean=true;private var _trackBarRuler:VerticalTrackBarRuler;private var _trackBarButton:TrackBarButton;private var _curValue:int=0;//当前值private var _minValue:int=0;//最小值private var _maxValue:int=100;//最大值private var _increment:int=5;//每次操作的增/减量private var _minPos:Number;//滚动器最近的距离private var _maxPos:Number;//滚动器最远的距离private var _buttonW:Number=10;private var _buttonH:Number=10;public function get buttonW():Number{return _buttonW;}public function set buttonW(value:Number):void{if(_buttonW!=value){_w=_buttonW=value;refreshBackground();onLayout();}}public function get buttonH():Number{return _buttonH;}public function set buttonH(value:Number):void{if(_buttonH!=value){_buttonH=value;refreshBackground();onLayout();}}//是否绘制边框public function get isDrawBorder():Boolean{return _isDrawBorder;}public function set isDrawBorder(value:Boolean):void{if(_isDrawBorder!=value){_isDrawBorder=value;refreshBackground();}}//是否绘制背景public function get isDrawBackground():Boolean{return _isDrawBackground;}public function set isDrawBackground(value:Boolean):void{if(_isDrawBackground!=value){_isDrawBackground=value;refreshBackground();}}public function get maxValue():int{return _maxValue;}public function set maxValue(value:int):void{if(_maxValue!=value){if(_minValue>value)throw new Error("HorizontalTrackBar maxValue less then minValue error! maxValue:"+value+" minValue:"+_minValue);_maxValue=value;if(curValue>_maxValue)curValue=_maxValue;}}public function get minValue():int{return _minValue;}public function set minValue(value:int):void{if(_minValue!=value){if(value>_maxValue)throw new Error("HorizontalTrackBar minValue more then maxValue error! minValue:"+value+" maxValue:"+_maxValue);_minValue=value;if(curValue<_minValue)curValue=_minValue;}}public function get curValue():int{return _curValue;}public function set curValue(value:int):void{if(_curValue!=value){var preValue:int=value;if(preValue<_minValue)preValue=_minValue;else if(preValue>_maxValue)preValue=_maxValue;if(preValue!=_curValue){_curValue=preValue;if(_minValue==_maxValue){_trackBarButton.y=fixAndSetRollPackerY(_minPos);}else{_trackBarButton.y=fixAndSetRollPackerY(_minPos+(_maxPos-_minPos)*((_curValue-_minValue)/(_maxValue-_minValue)));}dispatchEvent(new TrackBarEvent(TrackBarEvent.VALUE_CHANGED,_curValue));}}}public override function set width(value:Number):void{if(width!=value){_w=_buttonW=value;onLayout();refreshBackground();}}public override function set height(value:Number):void{if(height!=value){_h=value;onLayout();refreshBackground();}}public function VerticalTrackBar(){super();}public function setWidthHeight($width:Number,$height:Number):void{_w=$width;_h=$height;onLayout();refreshBackground();}private function fixAndSetRollPackerY(prePos:Number):Number{if(prePos<_minPos)prePos=_minPos;else if(prePos>_maxPos)prePos=_maxPos;return prePos;}private function yTransformToValueAndSetIt(prePos:Number):void{if(_trackBarButton.y==prePos){return;}curValue=(prePos-_minPos)/(_maxPos-_minPos)*(_maxValue-_minValue)+_minValue;}private function onLayout():void{if(_h<_buttonH*2)_h=_buttonH*2;if(_w<_buttonH)_w=_buttonH;else if(_w>(_h-_buttonH))_w=(_h-_buttonH);_trackBarButton.height=_buttonH;_trackBarRuler.height=_h;_trackBarButton.width=_trackBarRuler.width=_w;_trackBarRuler.height-=_trackBarButton.height;_trackBarRuler.y=(_h-_trackBarRuler.height)/2;_trackBarButton.x=_w/2;if(_trackBarButton.y<_trackBarRuler.y)_trackBarButton.y=_trackBarRuler.y;else if(_trackBarButton.y>_trackBarRuler.y+_trackBarRuler.height)_trackBarButton.y=_trackBarRuler.y+_trackBarRuler.height;_minPos=_trackBarRuler.y;_maxPos=_minPos+_trackBarRuler.height;}protected override function initialize():void{_w=10;_h=100;_trackBarRuler=new VerticalTrackBarRuler();addChild(_trackBarRuler);_trackBarButton=new TrackBarButton();addChild(_trackBarButton);if(stage){onAddedToStageHandler();}else{addEventListener(Event.ADDED_TO_STAGE,onAddedToStageHandler);}onLayout();}private function onAddedToStageHandler(e:Event=null):void{removeEventListener(Event.ADDED_TO_STAGE,onAddedToStageHandler);addEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStageHandler);_trackBarButton.addEventListener(MouseEvent.MOUSE_DOWN,onRollPackerMouseDownHandler);}private function onRemovedFromStageHandler(e:Event):void{removeEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStageHandler);_trackBarButton.removeEventListener(MouseEvent.MOUSE_DOWN,onRollPackerMouseDownHandler);stage.removeEventListener(Event.ENTER_FRAME,onStageEnterFrameHandler);stage.removeEventListener(MouseEvent.MOUSE_UP,onStageMouseUpHandler);}//鼠标点下滚动器时,滚动器的备份坐标private var _mouseDownTrackBarButtonSourceY:Number=0;//鼠标点下滚动器时,相对舞台的鼠标x坐标private var _mouseDownStageMouseSourceY:Number=0;//鼠标点下滚动器时,相对舞台的上一次的鼠标x坐标private var _lastStageMouseY:Number=0;private function onStageEnterFrameHandler(e:Event):void{if(_lastStageMouseY!=stage.mouseY){yTransformToValueAndSetIt(fixAndSetRollPackerY(_mouseDownTrackBarButtonSourceY+(stage.mouseY-_mouseDownStageMouseSourceY)));_lastStageMouseY=stage.mouseY;}}private function onStageMouseUpHandler(e:MouseEvent):void{stage.removeEventListener(Event.ENTER_FRAME,onStageEnterFrameHandler);_trackBarButton.addEventListener(MouseEvent.MOUSE_DOWN,onRollPackerMouseDownHandler);}private function onRollPackerMouseDownHandler(e:MouseEvent):void{_mouseDownTrackBarButtonSourceY=_trackBarButton.y;_mouseDownStageMouseSourceY=stage.mouseY;_trackBarButton.removeEventListener(MouseEvent.MOUSE_DOWN,onRollPackerMouseDownHandler);stage.addEventListener(Event.ENTER_FRAME,onStageEnterFrameHandler);stage.addEventListener(MouseEvent.MOUSE_UP,onStageMouseUpHandler);}protected override function refreshBackground():void{this.graphics.clear();if(_isDrawBackground){this.graphics.beginFill(0x00ff00,.1);this.graphics.drawRect(0,0,width,height);this.graphics.endFill();}if(_isDrawBorder){this.graphics.lineStyle(1,0,.5);this.graphics.moveTo(0,0);this.graphics.lineTo(width,0);this.graphics.lineTo(width,height);this.graphics.lineTo(0,height);this.graphics.lineTo(0,0);}}}}

测试类:

package test{import controlsEvents.TrackBarEvent;import flash.display.Sprite;import flash.display.StageAlign;import flash.display.StageScaleMode;import flash.events.Event;import flash.events.MouseEvent;public class VerticalTrackBarTest extends Sprite{private var author:Label;private var trackBar:VerticalTrackBar;private var lb:Label;private var bt:Button;public function VerticalTrackBarTest(){super();stage.color=0xccccbb;stage.frameRate=60;stage.align=StageAlign.TOP_LEFT;stage.scaleMode=StageScaleMode.NO_SCALE;author=new Label();addChild(author);author.textColor=0x00ff00;author.fontSize=24;author.x=100;author.y=50;author.text="作者:Jave.Lin";trackBar=new VerticalTrackBar();addChild(trackBar);trackBar.isDrawBorder=false;trackBar.x=100;trackBar.y=100;trackBar.maxValue=10000;trackBar.minValue=100;trackBar.addEventListener(TrackBarEvent.VALUE_CHANGED,onValueChangedHandler);lb=new Label();addChild(lb);lb.x=50;lb.y=120;lb.text="VerticalTrackBarTest minValue:"+trackBar.minValue+" maxValue:"+trackBar.maxValue+" value:"+trackBar.curValue;bt=new Button();addChild(bt);bt.x=100;bt.y=200;bt.addEventListener(MouseEvent.CLICK,onClick);}private var dW:Number=5;private var dH:Number=5;private function onEnterFrame(e:Event):void{if(trackBar.width<20){dW=5;}else if(trackBar.width>100){dW=-5;}if(trackBar.height<30){dH=5;}else if(trackBar.height>200){dH=-5;}trackBar.setWidthHeight(trackBar.width+dW,trackBar.height+dH);}private function onClick(e:MouseEvent):void{if(trackBar.hasEventListener(Event.ENTER_FRAME)){trackBar.removeEventListener(Event.ENTER_FRAME,onEnterFrame);}else{trackBar.addEventListener(Event.ENTER_FRAME,onEnterFrame);}}private function onValueChangedHandler(e:TrackBarEvent):void{lb.text="VerticalTrackBarTest minValue:"+trackBar.minValue+" maxValue:"+trackBar.maxValue+" value:"+e.value;}}}

运行图片效果: