Flash AS3教程:动态文本滚动条 程序员文章站 2024-01-20 13:32:40 学AS3几个星期了,发一个我的小练习:动态文本滚动条 功能说明: 本版滚动条除了继续保持体积小(小于2K),界面容易修改,资源占用率小的优势外,主要有以下几点改进: ... 08-10-06... 学as3几个星期了,发一个我的小练习:动态文本滚动条 功能说明: 本版滚动条除了继续保持体积小(小于2k),界面容易修改,资源占用率小的优势外,主要有以下几点改进: 使用as3编写。 宽高动态指定。 增加滚动条背景点击事件。 消除了鼠标滚轮无法同时准确控制多个文本框的重大bug。 源文件下载 使用方法见源文件 为了方便懒人,直接帖一下代码: package com.qoolu.component{ import flash.events.mouseevent; import flash.events.event; import flash.display.simplebutton; import flash.text.textfield; import flash.display.sprite; import flash.utils.gettimer; import flash.geom.rectangle; /** * @author 寂寞火山:[url]http://www.huoshan.org[/url] * @version v5 [08.3.15] * 动态文本滚动条 */ public class scrollbar extends sprite { //=============本类属性============== ////接口元件 private var scrolltext : textfield; private var scrollbar_sprite : sprite; private var up_btn : simplebutton; private var down_btn : simplebutton; private var pole_sprite : sprite; private var bg_sprite : sprite; ////初始数据 private var polestartheight : number; private var polestarty : number; private var totalpixels : number; private var isselect : boolean; ////上下滚动按钮按钮下时间 private var puttime : number; /** * @param scrolltext_fc:被滚动的文本框 * @param scrollbarmc_fc:舞台上与本类所代理的滚动条元件 * @param height_fc:滚动条高 * @param width_fc:滚动条宽 */ public function scrollbar(scrolltext_fc : textfield, scrollbarmc_fc : sprite, height_fc : uint = 0,width_fc : uint = 0) { //——————滚动条_sprite,滚动条按钮和滑块mc,被滚动的文本域初始化 scrolltext = scrolltext_fc; scrollbar_sprite = scrollbarmc_fc; up_btn = simplebutton(scrollbar_sprite.getchildbyname("up_btn")); down_btn = simplebutton(scrollbar_sprite.getchildbyname("down_btn")); pole_sprite = sprite(scrollbar_sprite.getchildbyname("pole_mc")); bg_sprite = sprite(scrollbar_sprite.getchildbyname("bg_mc")); //——————可用性控制 pole_sprite.visible = false; up_btn.enabled = false; down_btn.enabled = false; //——————其他属性初始化 bg_sprite.usehandcursor = false; isselect = scrolltext.selectable; if(height_fc == 0) { bg_sprite.height = scrolltext.height; }else { bg_sprite.height = height_fc; } if(width_fc != 0) { bg_sprite.width = width_fc 2; pole_sprite.width = width_fc; up_btn.width = up_btn.height = down_btn.width = down_btn .height = width_fc; } down_btn.y = bg_sprite.y bg_sprite.height - down_btn.height - 1; polestartheight = math.floor(down_btn.y - up_btn.y - up_btn.height); polestarty = pole_sprite.y = math.floor(up_btn.y up_btn.height); //——————注册侦听器 //文本滚动与鼠标滚轮 scrolltext.addeventlistener(event.scroll, textscroll); scrolltext.addeventlistener(mouseevent.mouse_wheel, mousewheel); //上滚动按钮 up_btn.addeventlistener(mouseevent.mouse_down, upbtn); up_btn.stage.addeventlistener(mouseevent.mouse_up, upbtnup); //下滚动按钮 down_btn.addeventlistener(mouseevent.mouse_down, downbtn); down_btn.stage.addeventlistener(mouseevent.mouse_up, downbtnup); //滑块 pole_sprite.addeventlistener(mouseevent.mouse_down, polesprite); pole_sprite.stage.addeventlistener(mouseevent.mouse_up, poleup); //滑块背景点击 bg_sprite.addeventlistener(mouseevent.mouse_down, bgdown); } /** * 文本滚动事件 */ private function textscroll(event : event) : void { //判断滑块儿是否显示,并根据文本内容多少定义滑块高度 if(scrolltext.maxscrollv != 1) { pole_sprite.visible = true; up_btn.enabled = true; down_btn.enabled = true; //定义一个高度因子,此因子随加载文本的增多,将无限趋向于1 var heightvar : number = 1 - (scrolltext.maxscrollv - 1) / scrolltext.maxscrollv; //根据高度因子初始化滑块的高度 pole_sprite.height = math.floor(polestartheight * math.pow(heightvar, 1 / 3)); totalpixels = math.floor(down_btn.y - up_btn.y - up_btn.height - pole_sprite.height); pole_sprite.y = math.floor(polestarty totalpixels * (scrolltext.scrollv - 1) / (scrolltext.maxscrollv - 1)); }else { pole_sprite.visible = false; up_btn.enabled = false; down_btn.enabled = false; } } /** * 滑块滚动 */ private function polesprite(event : mouseevent) : void { //首先取消文本框滚动侦听,因为文本滚动的时候会设置滑块的位置,而此时是通过滑块调整文本的位置,所以会产生冲突 scrolltext.removeeventlistener(event.scroll, textscroll); //监听舞台,这样可以保证拖动滑竿的时候,鼠标在舞台的任意位置松手,都会停止拖动 scrollbar_sprite.stage.addeventlistener(mouseevent.mouse_up, poleup); //限定拖动范围 var dragrect : rectangle = new rectangle(pole_sprite.x, polestarty, 0, totalpixels); pole_sprite.startdrag(false, dragrect); scrollbar_sprite.addeventlistener(event.enter_frame, poledown); } private function poledown(event : event) : void { //在滚动过程中及时获得滑块所处位置 var nowposition : number = math.floor(pole_sprite.y); //使文本随滚动条滚动,这里为什么要加1,可见scroll属性值应该是取正的,也就是说它会删除小数部分,而非采用四舍五入制? scrolltext.scrollv = (scrolltext.maxscrollv - 1) * (nowposition - polestarty) / totalpixels 2; //误差校正 var unitpixels : number = totalpixels / (scrolltext.maxscrollv - 1); if((nowposition - polestarty) < unitpixels) { scrolltext.scrollv = (scrolltext.maxscrollv - 1) * (nowposition - polestarty) / totalpixels; } } private function poleup(event : mouseevent) : void { pole_sprite.stopdrag(); scrollbar_sprite.removeeventlistener(event.enter_frame, poledown); scrollbar_sprite.stage.removeeventlistener(mouseevent.mouse_up, poleup); scrolltext.addeventlistener(event.scroll, textscroll); } /** * 滑块背景点击 */ private function bgdown(event : mouseevent) : void { var nowposition : number; if((scrollbar_sprite.mousey - up_btn.y) < (pole_sprite.height / 2)) { nowposition = math.floor(up_btn.y up_btn.height); }else if((down_btn.y - scrollbar_sprite.mousey) < pole_sprite.height / 2) { nowposition = math.floor(down_btn.y - pole_sprite.height); }else { nowposition = scrollbar_sprite.mousey - pole_sprite.height / 2; } pole_sprite.y = nowposition; scrolltext.scrollv = (scrolltext.maxscrollv - 1) * (nowposition - polestarty) / totalpixels 2; var unitpixels : number = totalpixels / (scrolltext.maxscrollv - 1); if((nowposition - polestarty) < unitpixels) { scrolltext.scrollv = (scrolltext.maxscrollv - 1) * (nowposition - polestarty) / totalpixels 1; } } /** * 下滚动按钮 */ private function downbtn(event : mouseevent) : void { scrolltext.scrollv ; pole_sprite.y = math.floor(polestarty totalpixels * (scrolltext.scrollv - 1) / (scrolltext.maxscrollv - 1)); //当鼠标在按钮上按下的时间大于设定时间时,连续滚动 puttime = gettimer(); scrollbar_sprite.addeventlistener(event.enter_frame, downbtndown); } private function downbtndown(event : event) : void { if(gettimer() - puttime > 500) { scrolltext.scrollv ; pole_sprite.y = math.floor(polestarty totalpixels * (scrolltext.scrollv - 1) / (scrolltext.maxscrollv - 1)); } } private function downbtnup(event : mouseevent) : void { scrollbar_sprite.removeeventlistener(event.enter_frame, downbtndown); } /** * 上滚动按钮 */ private function upbtn(event : mouseevent) : void { scrolltext.scrollv--; pole_sprite.y = math.floor(polestarty totalpixels * (scrolltext.scrollv - 1) / (scrolltext.maxscrollv - 1)); //当鼠标在按钮上按下的时间大于设定时间时,连续滚动 puttime = gettimer(); scrollbar_sprite.addeventlistener(event.enter_frame, upbtndown); } private function upbtndown(event : event) : void { if(gettimer() - puttime > 500) { scrolltext.scrollv--; pole_sprite.y = math.floor(polestarty totalpixels * (scrolltext.scrollv - 1) / (scrolltext.maxscrollv - 1)); } } private function upbtnup(event : mouseevent) : void { scrollbar_sprite.removeeventlistener(event.enter_frame, upbtndown); } /** * 鼠标滚轮事件 */ private function mousewheel(event : mouseevent) : void { if(isselect == false) { scrolltext.scrollv -= math.floor(event.delta / 2); }else if(isselect == true) { event.delta = 1; } pole_sprite.y = math.floor(polestarty totalpixels * (scrolltext.scrollv - 1) / (scrolltext.maxscrollv - 1)); } }} 上一篇: 华硕飞行堡垒FX60VM值得买吗?华硕飞行堡垒FX60VM游戏本详细评测图解 下一篇: python中MySQLdb模块用法实例 推荐阅读 Flash AS3教程:动态文本滚动条 Flash cs6怎么使用代码实现动态文本? Flash as3教程:OutDisplay类 Flash as3制作打字动画效果实例教程 Flash AS3制作火苗跳动的gif动画教程 android开发教程之文本框加滚动条scrollview flash怎么分离文本? flash将文字转换为形状的教程 Flash AS3教程:ApplySocket类 Flash AS教程:文本类对象知识总结 Flash AS3教程:下雪动画效果