[转]《元件滚动条》

《元件滚动条》

/*
================================================================================

《元件滚动条》

更改了对文本滚动控制改为对元件的控制,并增加缓动效果。
代码借鉴了:火山动态文本滚动条 V5 ,特此注明!
------------------------------------------------------------

Copyright (c) 2011 [无空]

My web:
闪耀空间
http://www.flash-me.cn/
E-mail:
flashme@live.cn

2011-3-4
================================================================================
*/
package {
import flash.events.MouseEvent;
import flash.events.Event;
import flash.display.SimpleButton;
import flash.text.TextField;
import flash.display.Sprite;
//import flash.display.MovieClip;
import flash.utils.getTimer;
import flash.geom.Rectangle;


public class myScrollBar extends Sprite {

//=============本类属性==============
接口元件
private var scrollCon:Sprite;
private var scrollBar_sprite:Sprite;
private var up_btn:SimpleButton;
private var down_btn:SimpleButton;
private var pole_sprite:Sprite;
private var bg_sprite:Sprite;
初始数据
private var poleStartHeight:Number;
private var poleStartY:Number;
private var totalPixels:Number;
private var areaY:int;
private var areaBg:uint;
private var easingSpeed:uint=7;
上下滚动按钮按钮下时间
private var putTime:Number;

/**
* @param scrollCon_fc:被滚动的元件
* @param scrollBarMc_fc:舞台上与本类所代理的滚动条元件
* @param height_fc:滚动条高
* @param width_fc:滚动条宽
*/
public function myScrollBar(scrollCon_fc:Sprite, scrollBarMc_fc:Sprite, area_fc:uint=0, height_fc:uint=0, width_fc:uint=0) {
//——————滚动条_sprite,滚动条按钮和滑块mc,被滚动的文本域初始化
scrollCon=scrollCon_fc;
scrollBar_sprite=scrollBarMc_fc;
up_btn=SimpleButton(scrollBar_sprite.getChildByName("up_btn"));
down_btn=SimpleButton(scrollBar_sprite.getChildByName("down_btn"));
pole_sprite=Sprite(scrollBar_sprite.getChildByName("pole_mc"));
bg_sprite=Sprite(scrollBar_sprite.getChildByName("bg_mc"));

//——————可用性控制
pole_sprite.visible=false;
up_btn.enabled=false;
down_btn.enabled=false;

//——————其他属性初始化
areaY = scrollCon.y;
if(area_fc==0){
//未接收到高度定义时默认让其上下距离相等
area_fc=scrollCon.parent.stage.stageHeight-areaY*2;
}
areaBg = area_fc;
bg_sprite.useHandCursor=false;

//遮罩
var maskSprite:Sprite=new Sprite();
maskSprite.graphics.beginFill(0xff0000);
maskSprite.graphics.drawRect(scrollCon.x,areaY,scrollCon.width,areaBg);
maskSprite.graphics.endFill();
//遮罩无需放入显示列表
//***若需要控制遮罩位置等相关属性可将下面注释取消***
//maskSprite.name="maskSprite";
//scrollCon.parent.addChild(maskSprite);
scrollCon.mask=maskSprite;

if (height_fc==0) {
bg_sprite.height=areaBg;
} else {
bg_sprite.height=height_fc;
}
if (width_fc!=0) {
bg_sprite.width=width_fc+2;
pole_sprite.width=width_fc;
up_btn.width=up_btn.height=down_btn.width=down_btn.height=width_fc;
}
down_btn.y=bg_sprite.y+bg_sprite.height-down_btn.height;
poleStartHeight=Math.floor(down_btn.y-up_btn.y-up_btn.height);
poleStartY=pole_sprite.y=Math.floor(up_btn.y+up_btn.height);


//——————注册侦听器

//用鼠标接触元件的方式来更新高度数据,用这种方式侦听或许不太好,但没找到更好办法。
scrollCon.addEventListener(MouseEvent.MOUSE_OVER, renew);
scrollBar_sprite.addEventListener(MouseEvent.MOUSE_OVER, renew);
//初始运行scrollBar_sprite侦听
scrollBar_sprite.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_OVER));

//鼠标滚轮
scrollCon.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheel);
//上滚动按钮
up_btn.addEventListener(MouseEvent.MOUSE_DOWN, upBtn);
up_btn.stage.addEventListener(MouseEvent.MOUSE_UP, upBtnUp);
//下滚动按钮
down_btn.addEventListener(MouseEvent.MOUSE_DOWN, downBtn);
down_btn.stage.addEventListener(MouseEvent.MOUSE_UP, downBtnUp);
//滑块
pole_sprite.addEventListener(MouseEvent.MOUSE_DOWN, poleSprite);
pole_sprite.stage.addEventListener(MouseEvent.MOUSE_UP, poleUp);
//滑块背景点击
bg_sprite.addEventListener(MouseEvent.MOUSE_DOWN, bgDown);

}

private function renew(event : MouseEvent):void {
//判断滑块儿是否显示,并根据元件高度定义滑块高度
if (scrollCon.height>areaBg) {
pole_sprite.visible=true;
up_btn.enabled=true;
down_btn.enabled=true;
//定义一个高度因子
var heightVar:Number=areaBg/scrollCon.height;
//根据高度因子初始化滑块的高度
pole_sprite.height=Math.floor(poleStartHeight*Math.pow(heightVar,1/3));
//拖动条可响应的范围
totalPixels=Math.floor(down_btn.y-up_btn.y-up_btn.height-pole_sprite.height);
pole_sprite.y=PoleNewY(scrollCon.y);

} else {
pole_sprite.visible=false;
up_btn.enabled=false;
down_btn.enabled=false;
}
}

/**
* 计算公式
*/
//以拖动条的位置计算来MC的位置,返回int值
private function ConNewY(nowPosition:int):int {
return -(scrollCon.height-areaBg)*(nowPosition-poleStartY)/totalPixels +areaY;
}
//以MC的位置来计算拖动条的位置,返回int值
private function PoleNewY(nowPosition:int):int {
return totalPixels*(areaY-nowPosition)/(scrollCon.height-areaBg) +poleStartY;
}


/**
* 滑块滚动
*/
private function poleSprite(event : MouseEvent):void {
//监听舞台,这样可以保证拖动滑竿的时候,鼠标在舞台的任意位置松手,都会停止拖动
scrollBar_sprite.stage.addEventListener(MouseEvent.MOUSE_UP, poleUp);
//限定拖动范围
var dragRect:Rectangle=new Rectangle(pole_sprite.x,poleStartY,0,totalPixels);
pole_sprite.startDrag(false, dragRect);
scrollBar_sprite.addEventListener(Event.ENTER_FRAME, poleDown);
}

private function poleDown(event : Event):void {
//在滚动过程中及时获得滑块所处位置
var nowPosition:int=pole_sprite.y;
//新位置
var newY:int=ConNewY(nowPosition);
//缓动效果,scrollCon.y的位置: scrollCon.y += ((计算出的新位置)-scrollCon.y)/缓动值
scrollCon.y += (newY - scrollCon.y)/easingSpeed;

}

private function poleUp(event : MouseEvent):void {
var nowPosition:int=pole_sprite.y;
//弹起在次计算的原因是当鼠标弹起时移除了poleDown函数里的缓动效果,导致scrollCon没有到达计算位置。
scrollCon.y=ConNewY(nowPosition);

pole_sprite.stopDrag();
scrollBar_sprite.removeEventListener(Event.ENTER_FRAME, poleDown);
scrollBar_sprite.stage.removeEventListener(MouseEvent.MOUSE_UP, poleUp);
//scrollCon.addEventListener(Event.SCROLL, textScroll);
}

/**
* 滑块背景点击
*/
private function bgDown(event : MouseEvent):void {
var nowPosition:int;
if ((scrollBar_sprite.mouseY-up_btn.y-up_btn.height) < (pole_sprite.height / 2)) {
nowPosition=Math.floor(up_btn.y+up_btn.height);
} else if ((down_btn.y - scrollBar_sprite.mouseY) < pole_sprite.height / 2) {
nowPosition=Math.floor(down_btn.y-pole_sprite.height);
} else {
nowPosition=scrollBar_sprite.mouseY-pole_sprite.height/2;
}
pole_sprite.y=nowPosition;
scrollCon.y=ConNewY(nowPosition);

}

/**
* 下滚动按钮
*/
private function downBtn(event : MouseEvent):void {
if (scrollCon.y>(areaY+areaBg-scrollCon.height)) {
scrollCon.y-=10;
var nowPosition:int=scrollCon.y;
pole_sprite.y=PoleNewY(nowPosition);
}
//当鼠标在按钮上按下的时间大于设定时间时,连续滚动
putTime=getTimer();
scrollBar_sprite.addEventListener(Event.ENTER_FRAME, downBtnDown);
}

private function downBtnDown(event : Event):void {
if (getTimer()-putTime>500) {
if (scrollCon.y>(areaY+areaBg-scrollCon.height)) {
scrollCon.y-=1;
var nowPosition:int=scrollCon.y;
pole_sprite.y=PoleNewY(nowPosition);
}
}
}

private function downBtnUp(event : MouseEvent):void {
scrollBar_sprite.removeEventListener(Event.ENTER_FRAME, downBtnDown);
}

/**
* 上滚动按钮
*/
private function upBtn(event : MouseEvent):void {
if (scrollCon.y<areaY) {
scrollCon.y+=10;
var nowPosition:int=scrollCon.y;
pole_sprite.y=PoleNewY(nowPosition);
}
//当鼠标在按钮上按下的时间大于设定时间时,连续滚动
putTime=getTimer();
scrollBar_sprite.addEventListener(Event.ENTER_FRAME, upBtnDown);
}

private function upBtnDown(event : Event):void {
if (getTimer()-putTime>500) {
if (scrollCon.y<areaY) {
scrollCon.y+=1;
var nowPosition:int=scrollCon.y;
pole_sprite.y=PoleNewY(nowPosition);
}
}
}

private function upBtnUp(event : MouseEvent):void {
scrollBar_sprite.removeEventListener(Event.ENTER_FRAME, upBtnDown);
}

/**
* 鼠标滚轮事件
*/
private function mouseWheel(event : MouseEvent):void {

var nowPosition:int;
if (event.delta<0) {
if (scrollCon.y>(areaY+areaBg-scrollCon.height)) {
scrollCon.y+=Math.floor(event.delta*3);
nowPosition=scrollCon.y;
pole_sprite.y=PoleNewY(nowPosition);
}
} else if (event.delta>0) {
if (scrollCon.y<areaY) {
scrollCon.y+=Math.floor(event.delta*3);
nowPosition=scrollCon.y;
pole_sprite.y=PoleNewY(nowPosition);
}
}

}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值