论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS编程教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

再写动态文本滚动条

文章类别:Flash AS编程 | 发表日期:2008-10-6 17:37:13


★上次写过一个基于scroll值的动态文本滚动条了,其实那次主要是为了寻求解决重大BUG的方法,却没想到被好多网站当成教程转载,于是就很不安,今天专门抽时间又把这个滚动条完善了一下。尽管还有不少BUG,但比上一次进步了很多:)

★功能:
→支持动态文本载入,真正基于scroll值
→支持按钮,滑块拖动,鼠标滚轮,滚动条背景点击
→支持选择文本时的拖拽滚动
→能根据文本的增加和减少自动调整滑块位置
→修正了滚动条溢出的BUG
→体积非常小,只有2K,而且对资源的占用率也降到最低

★缺陷:
→如果滑块在最底端,当一次性删除大量文本时,仍会导致短暂的滚动条溢出,不过它回立即自动修复
→按钮控制、滑块控制、以及滚动条背景点击控制之间相互切换的时候,会导致一行的偏差,对于这个BUG,我真的无能为力了,希望高手能指教一下,另外我也真的非常想知道MM的srollbar组件到底是怎么做的!?

★说明:
→下面我将贴出这个滚动条的所有代码,并进行了逐行注释。在看代码之前,建议先看一下这个说明图示,对理解滚动条原理以及代码很有帮助。
→图示:http://www.huoshan.org/shiyan/gundongtiao/gundongtiao3.htm
→源文件:http://www.huoshan.org/shiyan/gundongtiao/gundongtiao3.rar
 
代码部分:

//=================系统初始化=================//
//——————界面初始化
//小滑块不可见,上下按钮不可用
huakuai_mc._visible = false;
shang_btn.enabled = false;
xia_btn.enabled = false;
//初始化点击热区的影片
requ_mc._alpha = 0;
requ_mc._width = this._width;
requ_mc._height = xia_btn._y-shang_btn._y-shang_btn._height;
requ_mc._x = 0;
requ_mc._y = shang_btn._y+shang_btn._height;
//——————变量初始化
//文本域接口变量:接收父剪辑文本域名字
var wenben_txt = _parent.wenben_txt;
//按钮按下的时间,当按下指定时间后,连续滚动
var zhidingshijian = 500;
//滑块儿高度随文本多少变化的指数因子,此因子小于1,大于零,其值越大,高度变化越剧烈
var zhishuyinzi = 1/3;
//滑块的初始高度为滚动条总高度,并记录
var chushigaodu = Math.floor(xia_btn._y-shang_btn._y-shang_btn._height);
//初始化滑块Y坐标,并记录
var ychushiweizhi = huakuai_mc._y=Math.floor(shang_btn._y+shang_btn._height);
//——————对象初始化
//为父剪辑的文字域注册侦听器,以侦听在文字域产生变化时,也就是在文本被载入进来时,执行下面的代码。这样就不用担心代码执行顺序问题!
var wenbenzhentingqi = new Object();
wenben_txt.addListener(wenbenzhentingqi);
//鼠标滚球滚动侦听对象
var shubiaozhentingqi = new Object();
Mouse.addListener(shubiaozhentingqi);
//====================滚动代码===================//
//——————当文字域载入完成时,触发onScroller事件!
wenbenzhentingqi.onScroller = function() {
       //判断滑块儿是否显示,并根据文本内容多少定义滑块高度
       if (wenben_txt.maxscroll != 1) {
              //小滑块可见,上下按钮可用
              huakuai_mc._visible = true;
              shang_btn.enabled = true;
              xia_btn.enabled = true;
              //定义一个高度因子,此因子随加载文本的增多,将无限趋向于1。
              var gaoduyinzi = 1-(wenben_txt.maxscroll-1)/wenben_txt.maxscroll;
              //根据高度因子初始化滑块的高度
              huakuai_mc._height = Math.floor(chushigaodu*Math.pow(gaoduyinzi, zhishuyinzi));
              //滑块滚动的总象素数                                             
              zongxiangsu = Math.floor(xia_btn._y-shang_btn._y-shang_btn._height-huakuai_mc._height);
              huakuai_mc._y = Math.floor(ychushiweizhi+zongxiangsu*(wenben_txt.scroll-1)/(wenben_txt.maxscroll-1));
       } else {
              //小滑块不可见,上下按钮不可用
              huakuai_mc._visible = false;
              shang_btn.enabled = false;
              xia_btn.enabled = false;
       }
};
//——————定义上按钮                      
shang_btn.onPress = function() {
       //获得按钮按下的时间
       var anxiashijian = getTimer();
       //文本域滚动
       wenben_txt.scroll--;
       //当按下时间超过指定时间时,连续滚动
       onEnterFrame = function () {
              if (getTimer()-anxiashijian>zhidingshijian) {
                     wenben_txt.scroll--;
              }
       };
};
//松开按钮时删除不需要的onEnterFrame
shang_btn.onRelease = shang_btn.onReleaseOutside=function () {
       delete onEnterFrame;
};
//——————定义下按钮,原理同“上按钮”,注释省略
xia_btn.onPress = function() {
       var anxiashijian = getTimer();
       wenben_txt.scroll++;
       onEnterFrame = function () {
              if (getTimer()-anxiashijian>zhidingshijian) {
                     wenben_txt.scroll++;
              }
       };
};
xia_btn.onRelease = xia_btn.onReleaseOutside=function () {
       delete onEnterFrame;
};
//——————滑块MC事件处理,当鼠标经过或按下时
huakuai_mc.onMouseDown = function() {
       if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
              //删除文本域的侦听器,避免冲突
              wenben_txt.removeListener(wenbenzhentingqi);
              //开始拖动
              this.startDrag(false, this._x, ychushiweizhi, this._x, ychushiweizhi+zongxiangsu);
              //使文本随滑块滚动
              this.onEnterFrame = function() {
                     //在滚动过程中即时获得“滑块所处位置”
                     var xianzaiweizhi = Math.floor(this._y);
                     //使文本随滚动条滚动,这里加1是因为当外部文本载入文本域完成后,
                     //就算没有滚动,scroll值默认就为1,所以需要加上,不然无法显示最后一行
                     //但加上以后,又会造成一个小BUG,就是按钮控制与滑块控制切换的时候,会造成一行的偏差
                     wenben_txt.scroll = (wenben_txt.maxscroll-1)*(xianzaiweizhi-ychushiweizhi)/zongxiangsu+1;
              };
       }
};
//滑块MC事件处理,鼠标移出或释放时
huakuai_mc.onMouseUp = function() {
       //“滑块”停止拖动
       this.stopDrag();
       //停止文本随滑块滚动事件
       delete this.onEnterFrame;
       //松开鼠标后,重新为文本框添加侦听器
       wenben_txt.addListener(wenbenzhentingqi);
};
//——————换用MOUSE对象的onMouseWheel方法结合侦听器实现滑块随鼠标滚球滚动
shubiaozhentingqi.onMouseWheel = function(delta) {
       //设定滚轮滚动一下,文本滚动一行,但如果您的文本域为“可选”,则会滚动四行,因为可选文本域默认的就有三行了
       //另外,这行代码会导致在FLASH的任意位置滚动滚轮,文本域都会感应到
       //如果你想回复正常状态,只需要将此行代码换为delta=1,不过此时如果您的文本域为“不可选”,则无法感应到滚轮;
       wenben_txt.scroll -= delta%2;
       huakuai_mc._y = Math.floor(ychushiweizhi+zongxiangsu*(wenben_txt.scroll-1)/(wenben_txt.maxscroll-1));
};
//——————点击滑块背景控制滚动
requ_mc.onMouseDown = function() {
       if (requ_mc.hitTest(_root._xmouse, _root._ymouse, true)) {
              //获取点击位置,并根据点击位置设置滚动
              var dianjiweizhi = _ymouse;
              wenben_txt.scroll = (wenben_txt.maxscroll-1)*(dianjiweizhi-ychushiweizhi)/zongxiangsu+1;
       }
};
//——————在文本框中监视行数变化(如果您不需要监视,可以删除下面的四行代码)
wenben_txt.onScroller = function() {
       //在_root中的动态文本框中,显示总行数和当前行
       _parent.zonghangshu_var = "总行数:"+wenben_txt.maxscroll;
       _parent.dangqianhang_var = "当前行:"+wenben_txt.scroll;
};
视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058