AS3 VerticalTrackBarRuler ---- 垂直摄量条

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;
		}
	}
}

运行图片效果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值