火山动态文本滚动条V5[AS3版]

在线演示
打包文件下载

代码如下:

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));
        }
    }
}

(0)

相关推荐

  • 火山动态文本滚动条V5[AS3版]

    在线演示打包文件下载 复制代码 代码如下: 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

  • python动态文本进度条的实例代码

    如何实现动态单行刷新,答案是--覆盖 但是怎么实现覆盖呢 关键在于不换行而且能回退到开始位置 那么就要用到 \r 这个东西就是让光标回退到当前行初始位置 记得不能让换行 上码 #文本进度条.py import time scale = 50 print("执行开始".center(scale, "-"))//居中对齐 start = time.perf_counter()//获取起始时间 for i in range(scale+1): a = i*'*' b =

  • iPod文本分割器(VBS版)

    因此暑假闲暇编写了这个简短精悍的脚本版的分割器.脚本版的最大的好处可以由使用者进行DIY. 具体情况就不多说了,关于txt编码的问题可以参考,iPod文本分割器 这里仅仅说明使用方法,将您需要分割的Txt文件直接拖放发到本脚本上就ok了. 以下是脚本代码,直接复制后保存为vbs文件就可以了! Good Luck ! 复制代码 代码如下: '------------------------------------------------------------ ' Description : Te

  • js动态移动滚动条至底部示例代码

    复制代码 代码如下: var currentPosition,timer; function GoBottom(){ timer=setInterval("runToBottom()",50); } function runToBottom(){ currentPosition=document.documentElement.scrollTop || document.body.scrollTop; currentPosition+=30; if(currentPosition<

  • vue实现动态添加数据滚动条自动滚动到底部的示例代码

    在使用vue实现聊天页面的时候,聊天数据动态加到页面中,需要实现滚动条也自动滚动到底部.这时我找到网上有个插件 vue-chat-scroll https://www.npmjs.com/package/vue-chat-scroll 但是安装后发现是用不了的,报错信息如下: VM14383:27 [Vue warn]: Failed to resolve directive: chat-scroll (found in <Hello>) 这个一直找不到原因,可能是我vue的版本是2.2不支持

  • 火山基础开发习惯总结2006

    总体说明:每个人玩FLASH一段时间后,肯定都会形成自己的一套开发习惯.好的习惯可以尽可能避免低级失误和不必要的麻烦,从而加速开发进程,提高开发质量.火山现在虽然只是业余爱好者,但两年的积累,再加上"火山之家"的开发,也自然而然的形成了火山特色的开发习惯.这些习惯从某种程度反映了我现在的开发水平,所以它基本上都是围绕着小型.快捷.面向过程的开发模式形成的,很多地方还很幼稚.不过以后随着我能力的不断提高,以及对面向对象编程思想的学习,它肯定还要不断的更新和完善. →库文件夹分类习惯: 1

  • iOS实现文本分页的方法示例

    前言 本篇文章将分为两部分,一部分是静态文本分页,一部分是动态文本分页即边填写文本边进行文本的分页. 我们所采用的方案为:TextKit进行处理,通过glyphRangeForTextContainer方法获取文本内容视图可容纳的文本范围来对文本进行切割分页. // Returns the range of characters which have been laid into the given container.  This is a less efficient method than

  • vue 中滚动条始终定位在底部的方法

    滚动条定位在底部,首先想到的是,动态修改滚动条到顶部的距离等于div的高度, 代码实现: var div = document.getElementById('data-list-content') div.scrollTop = div.scrollHeight 但是问题来了,滚动条并没有到达底部,而是距离底部还有一点距离(一脸懵逼) 估计是动态加载数据时,数据还未加载,滚动条就已经执行,知道原因了,那就实践呗. 第二次尝试,利用vue的watch监控数据的改变,然后动态修改滚动条到顶部的距离

  • Vue.js桌面端自定义滚动条组件之美化滚动条VScroll

    前言 前段时间有给大家分享一个vue桌面端弹框组件,今天再分享最近开发的一个vue pc端自定义滚动条组件. vscroll 一款基于vue2.x开发的网页端轻量级超小巧自定义美化滚动条组件.支持是否原生滚动条.鼠标移出是否自动隐藏.自定义滚动条尺寸及颜色等功能. 组件在设计开发之初借鉴了 el-scrollbar 及 vuebar 等组件设计思想. 通过简单的标签写法<v-scroll>...</v-scroll> 即可快速生成一个漂亮的替换原生滚动条. 参数配置 props:

  • 原生js实现自定义滚动条组件

    本文实例为大家分享了js实现自定义滚动条组件的具体代码,供大家参考,具体内容如下 功能需求: 1.按照数据结构创建菜单内容,显示在页面中: 2.点击菜单后,显示对应的下级菜单内容,如果整体内容溢出,则出现滚动条: 3.滚动条的高度要随着整体内容高度的改变而改变. 4.鼠标拖动滚动条,整体内容要随着向上滚动. 5.当鼠标滚动时,滚动条和整体内容也要相应滚动. 来看一下效果: 默认状态: 点击菜单,内容溢出后,出现滚动条: 鼠标拖动滚动条,整体内容随着向上滚动: 分析: 这个案例中包括折叠菜单和滚动

随机推荐