AS3.0自定义滚动条(滚动内容可以为Sprite或MovieClip等)

来源:互联网 发布:ubuntu dd iso 安装盘 编辑:程序博客网 时间:2024/05/21 09:43

本文转自:http://www.cnblogs.com/zhoujunfeng2011/archive/2011/07/15/2106989.html

AS3.0 实现自定义滚动条(滚动内容可以为Sprite 或 MovieClip等),修改属性类型即可!

源码:

Scrollbar.as

package ui {     import flash.display.Sprite;     import flash.events.MouseEvent;     import flash.events.Event;     import ui.ListenManager;     import flash.geom.Rectangle;      public class Scrollbar extends Sprite     {         public var obj:Sprite;//需进行滚动的对象         public var scrollmask:Sprite;//遮罩对象         public var scrollheight:Number;//滚动条高度         public var scrolltextnum:int;//文本显示行数         public var textspeed:int;//文本滚动速度(行/像素)         public var Scroll:Sprite;//自定义滚动条对象         public var bar:Sprite;//滑块         public var up:Sprite;//向上按钮         public var down:Sprite;//向下按钮         public var bg:Sprite;//滑槽         public var displayobject:*;//接受stage,必须传入         public var num:int;//计算滑块高度所用          private var bars:Number;//滑块可滑动距离         private var rect:Rectangle;//滑块可拖动范围         private var i:int = 0;         private var n:Number;         private var listenmanager:ListenManager = new ListenManager();///监听管理器         ////构造器函数/////         public function Scrollbar():void         {         }         /////初始化函数/////         public function init():void         {             if (checkhide())             {                 addEventListeners();             }             else             {                 bar.visible = false;             }             setxy();         }         ///判断是否显示滚动条等///         private function checkhide():Boolean         {             if (Scroll != null)             {                 if (obj.height <= scrollmask.height)                 {                     return false;                 }                 return true;             }             return false;         }         ///设置滚动条高度,对象遮罩等////         private function setxy():void         {             up.y = 1;             bg.y = up.height;             bar.x = 1.2;             bar.y = bg.y;             if (bar.height >= 10)             {                 n = (obj.height - scrollmask.height)/(num+20);                 bar.height = scrollmask.height - (obj.height - scrollmask.height)/n;             }             bg.height = scrollheight;             down.y = bg.y + bg.height;             bars = bg.height - bar.height;             obj.mask = scrollmask;             rect = new Rectangle(bar.x,bg.y,0,bg.height - bar.height);         }         ///当被滚动对象更新时,而需要改变滚动条状态,调用此方法///         public function update(num:int):void         {             if (checkhide())             {                 i++;                 if (bar.height >= 10)                 {                     n = (obj.height - scrollmask.height)/(num+20);                     bar.height = scrollmask.height - (obj.height - scrollmask.height)/n;                 }                 bar.y = bg.y + bg.height - bar.height;                 bar.y +=  bars * textspeed /(obj.height - scrollmask.height);                 obj.y = scrollmask.y - obj.height + scrollmask.height;                 objrun(textspeed);                 updatebar();                 bars = bg.height - bar.height;                 rect = new Rectangle(bar.x,bg.y,0,bg.height - bar.height);                 if (i == 1)                 {                     bar.visible = true;                     addEventListeners();                 }             }         }         ///为滚动条添加监听事件////         private function addEventListeners():void         {             listenmanager.fcn_add(bar,MouseEvent.MOUSE_DOWN,barclick);             listenmanager.fcn_add(bar,MouseEvent.MOUSE_UP,barup);             listenmanager.fcn_add(displayobject,MouseEvent.MOUSE_UP,barup);             listenmanager.fcn_add(up,MouseEvent.MOUSE_DOWN,upclick);             listenmanager.fcn_add(down,MouseEvent.MOUSE_DOWN,downclick);             listenmanager.fcn_add(Scroll,MouseEvent.MOUSE_WHEEL,mousewheel);             listenmanager.fcn_add(obj,MouseEvent.MOUSE_WHEEL,mousewheel);         }         ///鼠标点击滑块方法///;         private function barclick(evt:MouseEvent):void         {             bar.startDrag(false,rect);             listenmanager.fcn_add(bar,Event.ENTER_FRAME,bar_enter_frame);         }         ///鼠标点击滑块释放方法///;         private function barup(evt:MouseEvent):void         {             bar.stopDrag();             delevent();         }         ///鼠标点击向上按钮方法///         private function upclick(evt:MouseEvent):void         {             if (checkbar())             {                 bar.y -= bars * textspeed /(obj.height-scrollmask.height);//滑块移动的距离=滚动对象滚动的像素*滑块可移动的总距离/(被滚动对象的高度-遮罩的高度(即显示范围的高度))                 objrun(0-textspeed);                 //调用方法移动对象;                 updatebar();//校正滑块位置             }         }         ///鼠标点击向下按钮方法///         private function downclick(evt:MouseEvent):void         {             if (checkbar())             {                 bar.y +=  bars * textspeed /(obj.height - scrollmask.height);                 objrun(textspeed);                 updatebar();             }         }         ///鼠标滑轮事件///         private function mousewheel(evt:MouseEvent):void         {             if (evt.delta > 0)             {                 if (checkbar())                 {                     bar.y -=  bars * textspeed /(obj.height - scrollmask.height);                     objrun(-textspeed);                     updatebar();                 }             }             else             {                 if (checkbar())                 {                     bar.y +=  bars * textspeed /(obj.height - scrollmask.height);                     objrun(textspeed);                     updatebar();                 }             }         }         private function bar_enter_frame(evt:Event):void         {             obj.y = scrollmask.y - (bar.y - bg.y)*(obj.height - scrollmask.height)/bars;             if (obj.y > scrollmask.y)             {                 obj.y = scrollmask.y;             }             else if (obj.y < (scrollmask.y - obj.height + scrollmask.height))             {                 obj.y = scrollmask.y - obj.height + scrollmask.height;             }         }         private function objrun(i:Number):void         {             obj.y -=  i;             if (obj.y > scrollmask.y)             {                 obj.y = scrollmask.y;             }             else if (obj.y < (scrollmask.y - obj.height + scrollmask.height))             {                 obj.y = scrollmask.y - obj.height + scrollmask.height;             }         }         private function checkbar():Boolean         {             if (bar.y >= bg.y && bar.y <= (bars + bg.y))             {                 return true;             }             return false;         }         ///删除卸载事件侦听///         private function updatebar():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;             }         }         private function delevent():void         {             listenmanager.fcn_del(bar,Event.ENTER_FRAME,bar_enter_frame);         }     } }


ListenManager.as

package ui {     import flash.display.Sprite;     public class ListenManager extends Sprite     {         public function ListenManager()         {          }         public function fcn_add(obj:*,_type:String,fcn:Function):void         {             obj.addEventListener(_type,fcn);         }         public function fcn_del(obj:*,_type:String,fcn:Function):void         {             obj.removeEventListener(_type,fcn);         }     } }


loader.as

package ui {     import flash.display.Loader;     public class loader extends Loader     {         private var Name:String;         public function loader():void         {         }         public function get Names():String         {             return Name;         }         public function set Names(myname:String):void         {             Name = myname;         }     } }


simple.as

package ui {     import flash.display.Sprite;     import flash.display.SimpleButton;     import flash.text.TextField;     import flash.text.TextFormat;     import flash.text.TextFieldAutoSize;      public class simple extends Sprite     {         private var btnw:Number;         private var btnh:Number;         private var downcolor:uint;         private var upcolor:uint;         private var overcolor:uint;         private var lineStly:Boolean;         public function simple():void         {          }         public function getsimplebtn(str:String,btnw:Number = 50,btnh:Number = 30,downcolor:uint = 0x990066,upcolor:uint = 0xffffff,overcolor:uint = 0x666666,lineStly:Boolean = false):SimpleButton         {             this.name = str;             this.btnw = btnw;             this.btnh = btnh;             this.downcolor = downcolor;             this.upcolor = upcolor;             this.overcolor = overcolor;             this.lineStly = lineStly;             var btn:SimpleButton = new SimpleButton();             btn.downState = downbtn();             btn.upState = upbtn();             btn.overState = overbtn();             btn.hitTestState = hitbtn();             return btn;         }         private function hitbtn():Sprite         {             var sprite:Sprite = new Sprite();             sprite.graphics.beginFill(upcolor);             sprite.graphics.drawRect(0,0,btnw,btnh);             sprite.graphics.endFill();             return sprite;         }         private function downbtn():Sprite         {             var txt:TextField = txtstr(this.name);             var sprite:Sprite = DrawSprite(1);             sprite.addChild(txt);             return sprite;         }         private function upbtn():Sprite         {             var txt:TextField = txtstr(this.name);             var sprite:Sprite = DrawSprite(0);             sprite.addChild(txt);             return sprite;         }         private function overbtn():Sprite         {             var txt:TextField = txtstr(this.name);             var sprite:Sprite = DrawSprite(2);             sprite.addChild(txt);             return sprite;         }         private function txtstr(str:String):TextField         {             var txt:TextField = new TextField();             var format:TextFormat = new TextFormat();             format.font = "Verdana";             format.size = 12;             txt.autoSize = TextFieldAutoSize.LEFT;             txt.text = str;             txt.setTextFormat(format);             return txt;         }         private function DrawSprite(n:int):Sprite         {             var sprite:Sprite = new Sprite();             if (n == 0)             {                 sprite.graphics.beginFill(upcolor);             }             else if (n == 1)             {                 sprite.graphics.beginFill(downcolor);             }             else if (n == 2)             {                 sprite.graphics.beginFill(overcolor);             }             if(lineStly)             {                 sprite.graphics.lineStyle(1,0x660099);             }             sprite.graphics.drawRect(0,0,btnw,btnh);             sprite.graphics.endFill();             return sprite;         }     } }



文档类:Main.as

package  {     import flash.display.Sprite;     import ui.simple;     import ui.Scrollbar;     import flash.display.SimpleButton;     import flash.events.MouseEvent;     import flash.display.Shape;     import flash.net.URLLoader;     import flash.events.Event;     import flash.net.URLRequest;     import ui.loader;     import flash.display.Bitmap;     import flash.text.TextField;      public class Main extends Sprite     {         private var backbox:Sprite = new Sprite();         private var sprite:Sprite = new Sprite();         private var scrollcont:Sprite = new Sprite();         private var i:int = 0;         private var j:int = -1;         private var num:int;         private var bg:Sprite = new Sprite();         private var bar:Sprite = new Sprite();         private var up:Sprite = new Sprite();         private var down:Sprite = new Sprite();         private var listscroll:Scrollbar = new Scrollbar();         public function Main():void         {             init();         }         private function init():void         {             var urlloader:URLLoader = new URLLoader();             urlloader.addEventListener(Event.COMPLETE,com);             urlloader.load(new URLRequest("http://files.cnblogs.com/zhoujunfeng2011/Pictures/data.xml"));         }         private function com(evt:Event):void         {             var myxml:XML = new XML(evt.target.data);             num = myxml.child("pic").length();             for (var i:int =0; i<num; i++)             {                 var myloader:loader = new loader();                 myloader.contentLoaderInfo.addEventListener(Event.COMPLETE,piccom);                 myloader.load(new URLRequest(myxml.child("pic")[i].@url));                 myloader.Names = myxml.child("pic")[i]. @ name;             }         }         private function piccom(evt:Event):void         {             j++;             var myloader:loader = loader(evt.target.loader);             var bitmap:Bitmap = Bitmap(myloader.content);             var sprite:Sprite = new Sprite();             sprite.addChild(bitmap);             switch (myloader.Names)             {                 case "滑块" :                     bar = sprite;                     break;                 case "滑槽" :                     bg = sprite;                     break;                 case "向上" :                     up = sprite;                     break;                 case "向下" :                     down = sprite;                     break;             }             if (j == num-1)             {                 uiinit();             }         }         private function uiinit():void         {             var btn:simple = new simple();             var spmask:Sprite = new Sprite();             var Test_btn:SimpleButton;             backbox.graphics.beginFill(0xffffff);             backbox.graphics.lineStyle(1,0x660099);             backbox.graphics.drawRect(0,0,200,241);             backbox.graphics.endFill();             backbox.y = 10;             addChild(backbox);             scrollcont.x = backbox.width - 14;             scrollcont.y = backbox.y;             addChild(scrollcont);             down.y = scrollcont.y;             scrollcont.addChild(down);             scrollcont.addChild(bg);             scrollcont.addChild(up);             scrollcont.addChild(bar);             spmask.graphics.beginFill(0x000000);             spmask.graphics.drawRect(0,0,backbox.width,backbox.height);             spmask.graphics.endFill();             backbox.addChild(sprite);             backbox.addChild(spmask);             Test_btn = btn.getsimplebtn("点击添加",60,30,0xff00cc,0xcc00cc,0x9900cc);             Test_btn.x = 65;             Test_btn.y = backbox.height + 15;             this.addChild(Test_btn);             for (i; i< 120; i++)             {                 var sbtn:simple = new simple();                 var sp:SimpleButton;                 var str:String = i + 1 + " this is Testing!";                 sp = sbtn.getsimplebtn(str,185,20,0x990099,0x66ffff,0x99ffff,true);                 sp.x = 1;                 sp.y = i * 20;                 sprite.addChild(sp);             }             listscroll.displayobject = this.stage;             listscroll.obj = sprite;             listscroll.scrollmask = spmask;             listscroll.textspeed = 20;             listscroll.Scroll = scrollcont;             listscroll.scrollheight = 212;             listscroll.up = up;             listscroll.down = down;             listscroll.bg = bg;             listscroll.bar = bar;             listscroll.num = i;             listscroll.init();             Test_btn.addEventListener(MouseEvent.CLICK,Testbtn_click);         }         private function Testbtn_click(evt:MouseEvent):void         {             var sbtn:simple = new simple();             var sp:SimpleButton;             var str:String = i + 1 + " this is Testing!";             sp = sbtn.getsimplebtn(str,185,20,0x990099,0x66ffff,0x99ffff,true);             sp.x = 1;             sp.y = i * 20;             sprite.addChild(sp);             listscroll.update(i);             i++;         }     } }

为图方便所以使用了SimpleButton类型作为列表中的内容,,有些算法都是从网上收集起来的,不过稍改了下,希望会对你有帮助,代码有点乱,看了后希望点评下,谢谢!最后加上XML内容:

<?xml version="1.0" encoding="utf-8"?> <data>     <pic name="滑槽" url="http://files.cnblogs.com/zhoujunfeng2011/Pictures/bg.png"/>     <pic name="向上" url="http://files.cnblogs.com/zhoujunfeng2011/Pictures/up.png"/>     <pic name="向下" url="http://files.cnblogs.com/zhoujunfeng2011/Pictures/down.png"/>     <pic name="滑块" url="http://files.cnblogs.com/zhoujunfeng2011/Pictures/bar.png"/> </data>