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;
}
}
}
运行图片效果: