[转] 滚动条类(影片剪辑,动态文本都可用,自定义滚动条样式)

以前非专职做flash,用到滚动条时都是直接网上下载使用,网上找的又五花八门,开始找到用上就要花不少时间了,最近换了工作,改专职做flash了,需要用到滚动条,就花了点时间根据自己的想法写了个。
主要功能:
1.支持影片剪辑和动态文本
2.自定义滚动条样式
第一次写,有许多不足,欢迎拍砖,要是发现有什么问题,或是有哪些不足,或有哪些地方可以优化的欢迎反馈,我会及时更改。缓动效果有时间会加上,暂时还不需要用到,就懒得去写了。
*********************************************
fla实例已上传~~至少需要CS4才能打开,因为俺是用CS5做的,所以只能保存到CS4
*********************************************
[b]phhui_ScrollBar.as[/b]

package
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;

public class phhui_ScrollBar extends MovieClip
{
public var _obj:*=this;//滚动对象
public var _type:int=0;//0:文本,1:非文本
public var _mask:*;//遮罩对象
public var _h:int=0;//滚动条高度
public var _scrollvnum:int=0;//文本显示行数
public var _v:int=5;//文本滚动速度(行/像素)
public var _scroll:*;//自定义滚动条对象

private var _s:Number=0;//鼠标点击滑块时的纵坐标距滑块坐标距离
private var _bars:Number=0;//滑块可滑动距离
private var _bar:*;//滑块
private var _up:*;//向上按钮
private var _down:*;//向下按钮
private var _bg:*;//滑槽

private var listenMag:ListenManager=new ListenManager();//监听管理,这个只是简单的添加删除监听而已,没有记录或判断监听对象是否已存在,如有需要可以自己进行修改,这里只是因为懒得每个监听都要写addevent...所以用的

public function phhui_ScrollBar ()
{

}
public function init():void{//初始化
if(checkhide()==true){
_bar=_scroll.pq_bar;
_bg=_scroll.pq_bg;
_up=_scroll.pq_up;
_down=_scroll.pq_down;
setxy();
}else{
this.visible=false;
if(_scroll!=null){
_scroll.visible=false;
}
}
}
public function update():void{//当被滚动对象更新时,而需要改变滚动条状态,调用此方法
if(checkhide()==false){
this.visible=false;
if(_scroll!=null){
_scroll.visible=false;
}
}
}
private function checkhide():Boolean{//判断是否显示滚动条
if(_type==1&&_obj.height<=_mask.height){
return false;
}else if(_type==0&&int(_obj.maxScrollV)<_scrollvnum){
return false;
}
return true;
}
private function setxy():void{//设置滚动条高度,对象遮罩等
_bar.y=_bg.y;
_bar.x=_bg.x;
_bg.height=_h>0?_h-_up.height*2:_bg.height;
_down.y=_bg.y+_bg.height+_down.height;
_bars=_bg.height-_bar.height;
if(_type==1){
_obj.mask=_mask;
}
addlisten();
}
private function addlisten():void{//为滚动条添加监听事件
listenMag.fcn_add(_bar,MouseEvent.MOUSE_DOWN,barclick);
listenMag.fcn_add(_bar,MouseEvent.MOUSE_UP,barup);
listenMag.fcn_add(stage,MouseEvent.MOUSE_UP,barup);
listenMag.fcn_add(_bar,MouseEvent.MOUSE_UP,barup);
listenMag.fcn_add(_up,MouseEvent.MOUSE_DOWN,upclick);
listenMag.fcn_add(_down,MouseEvent.MOUSE_DOWN,downclick);
listenMag.fcn_add(_scroll,MouseEvent.MOUSE_WHEEL,mousewheel);
listenMag.fcn_add(_obj,MouseEvent.MOUSE_WHEEL,mousewheel);
}
private function barclick(e:MouseEvent):void{//鼠标点击滑块
_s=mouseY-_bar.y;
listenMag.fcn_add(_bar,Event.ENTER_FRAME,barevent);
}
private function barup(e:MouseEvent):void{//鼠标点击滑块释放
delevent();
}
private function upclick(e:MouseEvent):void{//鼠标点击向上按钮事件
if(checkbar()){
if(_type==0){
_bar.y-=_bars*_v/_obj.maxScrollV;//滑块移动的距离=文本滚动行数*滑块可移动的总距离/文本总行数
}else{
_bar.y-=_bars*_v/(_obj.height-_mask.height);//滑块移动的距离=滚动对象滚动的像素*滑块可移动的总距离/(被滚动对象的高度-遮罩的高度(即显示范围的高度))
}
objrun(0-_v);//调用方法移动对象
delevent();//校正滑块位置并删除监听
}
}
private function downclick(e:MouseEvent):void{//鼠标点击向下按钮事件
if(checkbar()){
if(_type==0){
_bar.y+=_bars*_v/_obj.maxScrollV;
}else{
_bar.y+=_bars*_v/(_obj.height-_mask.height);
}
objrun(_v);
delevent();
}
}
private function mousewheel(e:MouseEvent):void{//鼠标滑轮事件
if(e.delta>0){
if(checkbar()){
_bar.y-=2;
if(_type==0){
_obj.scrollV=(_bar.y-_bg.y)*_obj.maxScrollV/_bars;
}else{
_obj.y=_mask.y-(_bar.y-_bg.y)*(_obj.height-_mask.height)/_bars;
}
}else{
delevent();
}
}else{
if(checkbar()){
_bar.y+=2;
if(_type==0){
_obj.scrollV=(_bar.y-_bg.y)*_obj.maxScrollV/_bars;
}else{
_obj.y=_mask.y-(_bar.y-_bg.y)*(_obj.height-_mask.height)/_bars;
}
}else{
delevent();
}
}
}
private function barevent(e:Event):void{
if(checkbar()){
_bar.y=mouseY-_s;
if(_type==0){
_obj.scrollV=(_bar.y-_bg.y)*_obj.maxScrollV/_bars;
}else{
_obj.y=_mask.y-(_bar.y-_bg.y)*(_obj.height-_mask.height)/_bars;
}
}else{
delevent();
}
}
public function objrun(i:Number):void{
if(_type==0){
_obj.scrollV+=i;
}else{
_obj.y-=i;
if(_obj.y>_mask.y){
_obj.y=_mask.y;
}else if(_obj.y<(_mask.y-_obj.height+_mask.height)){
_obj.y=_mask.y-_obj.height+_mask.height;
}
}
}
public function checkbar():Boolean{
if(_bar.y>=_bg.y&&_bar.y<=(_bars+_bg.y)){
return true;
}
return false;
}
public function delevent():void{
if(_bar.y<_bg.y){
_bar.y=_bg.y;
}else if(_bar.y>(_bg.y+_bg.height-_bar.height)){
_bar.y=_bg.y+_bg.height-_bar.height;
}
listenMag.fcn_del(_bar,Event.ENTER_FRAME,barevent);
}
}
}
---------------------------------------------------------------------------------
[b]ListenManager.as[/b]
package ClassFile{
import flash.display.Sprite;
public class ListenManager extends Sprite {
public function ListenManager() {

}
public function fcn_add(obj:*,_type:String,fcn:Function):void {
if(obj==stage){
addEventListener(_type,fcn);
}else{
obj.addEventListener(_type,fcn);
}
}
public function fcn_del(obj:*,_type:String,fcn:Function):void {
obj.removeEventListener(_type,fcn);
}
}
}


========================================================
用法:
影片剪辑:


var scr:phhui_ScrollBar=new phhui_ScrollBar();
scr._type=1;
scr._obj=mc;
scr._mask=mc_mask;
scr._h=200;
scr._v=50;
scr._scroll=ss;//ss为自定义的滚动条MC实例名,里面对应的四个对象名要与类中的一样,即:滑块名为pq_bar,向上的按钮名为pq_up,向下的按钮为pq_down,滑槽名为pq_bg
scr.init();
--------------------------
动态文本:
var scr:phhui_ScrollBar=new phhui_ScrollBar();
scr._type=0;//默认为0,可省略
scr._obj=txt;//txt动态文本实例名
scr._scrollvnum=10;
scr._h=200;
scr._v=5;
scr._scroll=ss;
scr.init();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值