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

以前非专职做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_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();




你可能感兴趣的:(Flash,UP)