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