写了个滚动条的类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 } );
}
}




///
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值