`
china34420
  • 浏览: 133588 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

写了个滚动条的类ZScrollBar.as

阅读更多

package zkl.controls
{
	import com.greensock.TweenLite;
	import com.greensock.easing.Back;
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	
	/**
	 * 滚动条
	 * 约定滚动的控制的焦点都在左上角
	 * 滑块:可以被拖动的
	 * 滑道:滑块所在的拖动范围
	 * 内容:拖动滑块要触动的对象
	 * 使用实例:
	 * import zkl.controls.ZScrollBar;
	 * import zkl.controls.ZScrollBarDirection;
	 * var bar:ZScrollBar = new ZScrollBar();
	 * bar._stage = this.stage;
	 * bar._target = _target;
	 * bar._slideBar = slideBarV;
	 * bar._scrollBar = scrollBar;
	 * bar._targetScrollLength = _target.height - mask.height;
	 * bar.init();
	 * @author zkl
	 */
	public class ZScrollBar extends Sprite 
	{
		//所在舞台
		public var _stage:Stage;
		//被滚动的内容
		public var _target:DisplayObject;
		//内容滚动的距离
		public var _targetScrollLength:Number;
		//滚动条的滚动方向
		public var _direction:String = ZScrollBarDirection.VERTICAL;
		
		//滑块
		public var _scrollBar:Sprite;
		//滑道
		public var _slideBar:Sprite;
		//四个方向的滑块
		public var _upBar:Sprite;
		public var _downBar:Sprite;
		public var _leftBar:Sprite;
		public var _rightBar:Sprite;
		//滑块滚动的速度(只有设置的方向按钮,此值才有作用)
		public var _barSpeed:Number = 5;
		
		
		
		//滑块可以滑动的长度(有效的滑道)
		private var slideLength:Number;
		//滑块的滚动范围
		private var barDragRect:Rectangle;
		//对象的初始化坐标
		private var targetXY:Number = 0;
		
		//对象滚动的方向
		private var scrollDir:int;
		private static const UP:int = 0;
		private static const DOWN:int = 1;
		private static const LEFT:int = 2;
		private static const RIGHT:int = 3;
		
		public function ZScrollBar() {
			
		}
		
		/**
		 * 初始化
		 */
		public function init():void {
			if (_stage == null)_stage = _target.stage;
			if (_direction == ZScrollBarDirection.VERTICAL) {//垂直
				//滑块的初始位置
				_scrollBar.x = _slideBar.x + (_slideBar.width - _scrollBar.width) / 2;
				_scrollBar.y = _slideBar.y;
				//有效的滑道长度
				slideLength = _slideBar.height - _scrollBar.height;
				//滑块的可拖动范围
				barDragRect = new Rectangle(_slideBar.x + (_slideBar.width - _scrollBar.width) / 2, _slideBar.y, 0, slideLength);
				//
				targetXY = _target.y;
				
			}else if (_direction == ZScrollBarDirection.HORIZONTAL) {//水平
				//滑块的初始位置
				_scrollBar.x = _slideBar.x;
				_scrollBar.y = _slideBar.y + (_slideBar.height - _scrollBar.height) / 2;
				//有效的滑道长度
				slideLength = _slideBar.width - _scrollBar.width;
				//滑块的可拖动范围
				barDragRect = new Rectangle(_slideBar.x, _slideBar.y + (_slideBar.height - _scrollBar.height) / 2, slideLength, 0);
				
				targetXY = _target.x;
				
			}else {
				throw new Error("direction的值设置有误,请参考ZScrollBarDirection.as");
				return;
			}
			
			setListener();
			
		}
		
		//设置监听
		private var tempBar:Sprite;
		private function setListener():void {
			//scrollBar
			_scrollBar.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			//dir bar
			if (_upBar != null) {
				_upBar.addEventListener(MouseEvent.MOUSE_DOWN, dirDownHandler);
			}
			if (_downBar != null) {
				_downBar.addEventListener(MouseEvent.MOUSE_DOWN, dirDownHandler);
			}
			if (_leftBar != null) {
				_leftBar.addEventListener(MouseEvent.MOUSE_DOWN, dirDownHandler);
			}
			if (_rightBar != null) {
				_rightBar.addEventListener(MouseEvent.MOUSE_DOWN, dirDownHandler);
			}
		}
		//dir bar
		private function dirDownHandler(e:MouseEvent):void {
			tempBar = e.currentTarget as Sprite;
			switch(tempBar) {
				case _upBar:
				scrollDir = UP;
				break;
				case _downBar:
				scrollDir = DOWN;
				break;
				case _leftBar:
				scrollDir = LEFT;
				break;
				case _rightBar:
				scrollDir = RIGHT;
				break;
			}
			tempBar.addEventListener(Event.ENTER_FRAME, dirEnterFrame);
			tempBar.addEventListener(MouseEvent.MOUSE_UP, dirUpHandler);
			tempBar.addEventListener(MouseEvent.MOUSE_OUT, dirUpHandler);
		}
		private function dirUpHandler(e:MouseEvent):void {
			tempBar.removeEventListener(Event.ENTER_FRAME, dirEnterFrame);
			tempBar.removeEventListener(MouseEvent.MOUSE_UP, dirUpHandler);
			tempBar.removeEventListener(MouseEvent.MOUSE_OUT, dirUpHandler);
		}
		private function dirEnterFrame(e:Event):void {
			switch(scrollDir) {
				case UP:
				_scrollBar.y = Math.max(_slideBar.y, _scrollBar.y - _barSpeed);
				break;
				case DOWN:
				_scrollBar.y = Math.min(_slideBar.y + slideLength, _scrollBar.y + _barSpeed);
				break;
				case LEFT:
				_scrollBar.x = Math.max(_slideBar.x, _scrollBar.x - _barSpeed);
				break;
				case RIGHT:
				_scrollBar.x = Math.min(_slideBar.x + slideLength, _scrollBar.x + _barSpeed);
				break;
			}
			updateTargetPos();
		}
		//dir bar end
		
		//scrollBar
		private function mouseDownHandler(e:MouseEvent):void {
			_stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			_scrollBar.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
		}
		private function mouseMoveHandler(e:MouseEvent):void {
			_scrollBar.startDrag(false, barDragRect);
			_scrollBar.addEventListener(Event.ENTER_FRAME, scrollEnterFrameHandler);
		}
		private function mouseUpHandler(e:MouseEvent):void {
			_scrollBar.stopDrag();
			_scrollBar.removeEventListener(Event.ENTER_FRAME, scrollEnterFrameHandler);
			_scrollBar.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			_stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
		}
		private function scrollEnterFrameHandler(e:Event):void {
			updateTargetPos();
		}
		//scrollBar end
		
		//update
		private var percent:Number = 0;
		private function updateTargetPos():void {
			if (_direction == ZScrollBarDirection.VERTICAL) {
				percent = (_scrollBar.y - _slideBar.y) / slideLength;
				//_target.y = Math.round(targetXY - _targetScrollLength * percent);
				TweenLite.to(_target, 0.5, { y:Math.round(targetXY - _targetScrollLength * percent), ease:Back.easeOut } );
			}else if (_direction == ZScrollBarDirection.HORIZONTAL) {
				percent = (_scrollBar.x - _slideBar.x) / slideLength;
				//_target.x = Math.round(targetXY - _targetScrollLength * percent);
				TweenLite.to(_target, 0.5, { x:Math.round(targetXY - _targetScrollLength * percent), ease:Back.easeOut } );
			}
		}
		////////////////////////////////////////////////////////
		
		
		
		///
	}
	
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics