`

[转]《元件滚动条》

阅读更多
《元件滚动条》
/*
================================================================================

《元件滚动条》

更改了对文本滚动控制改为对元件的控制,并增加缓动效果。
代码借鉴了:火山动态文本滚动条 V5 ,特此注明!
------------------------------------------------------------

Copyright (c) 2011 [无空]

My web:
  闪耀空间
  http://www.flash-me.cn/
E-mail:
  flashme@live.cn

                                                  2011-3-4
================================================================================
*/
package {
	import flash.events.MouseEvent;
	import flash.events.Event;
	import flash.display.SimpleButton;
	import flash.text.TextField;
	import flash.display.Sprite;
	//import flash.display.MovieClip;
	import flash.utils.getTimer;
	import flash.geom.Rectangle;


	public class myScrollBar extends Sprite {

		//=============本类属性==============
		////接口元件
		private var scrollCon:Sprite;
		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 areaY:int;
		private var areaBg:uint;
		private var easingSpeed:uint=7;
		////上下滚动按钮按钮下时间
		private var putTime:Number;

		/**
		 * @param scrollCon_fc:被滚动的元件
		 * @param scrollBarMc_fc:舞台上与本类所代理的滚动条元件
		 * @param height_fc:滚动条高
		 * @param width_fc:滚动条宽
		 */
		public function myScrollBar(scrollCon_fc:Sprite, scrollBarMc_fc:Sprite, area_fc:uint=0, height_fc:uint=0, width_fc:uint=0) {
			//——————滚动条_sprite,滚动条按钮和滑块mc,被滚动的文本域初始化
			scrollCon=scrollCon_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;

			//——————其他属性初始化
			areaY = scrollCon.y;
			if(area_fc==0){
				//未接收到高度定义时默认让其上下距离相等
				area_fc=scrollCon.parent.stage.stageHeight-areaY*2;
			}
			areaBg = area_fc;
			bg_sprite.useHandCursor=false;
			
			//遮罩
			var maskSprite:Sprite=new Sprite();
			maskSprite.graphics.beginFill(0xff0000);
			maskSprite.graphics.drawRect(scrollCon.x,areaY,scrollCon.width,areaBg);
			maskSprite.graphics.endFill();
			//遮罩无需放入显示列表
			//***若需要控制遮罩位置等相关属性可将下面注释取消***
			//maskSprite.name="maskSprite";
			//scrollCon.parent.addChild(maskSprite);
			scrollCon.mask=maskSprite;
			
			if (height_fc==0) {
				bg_sprite.height=areaBg;
			} 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;
			poleStartHeight=Math.floor(down_btn.y-up_btn.y-up_btn.height);
			poleStartY=pole_sprite.y=Math.floor(up_btn.y+up_btn.height);
			

			//——————注册侦听器
			
			//用鼠标接触元件的方式来更新高度数据,用这种方式侦听或许不太好,但没找到更好办法。
			scrollCon.addEventListener(MouseEvent.MOUSE_OVER, renew);
			scrollBar_sprite.addEventListener(MouseEvent.MOUSE_OVER, renew);
			//初始运行scrollBar_sprite侦听
			scrollBar_sprite.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_OVER));
			
			//鼠标滚轮
			scrollCon.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 renew(event : MouseEvent):void {
			//判断滑块儿是否显示,并根据元件高度定义滑块高度
			if (scrollCon.height>areaBg) {
				pole_sprite.visible=true;
				up_btn.enabled=true;
				down_btn.enabled=true;
				//定义一个高度因子
				var heightVar:Number=areaBg/scrollCon.height;
				//根据高度因子初始化滑块的高度
				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=PoleNewY(scrollCon.y);

			} else {
				pole_sprite.visible=false;
				up_btn.enabled=false;
				down_btn.enabled=false;
			}
		}

		/**
		 * 计算公式
		 */
		//以拖动条的位置计算来MC的位置,返回int值
		private function ConNewY(nowPosition:int):int {
			return -(scrollCon.height-areaBg)*(nowPosition-poleStartY)/totalPixels +areaY;
		}
		//以MC的位置来计算拖动条的位置,返回int值
		private function PoleNewY(nowPosition:int):int {
			return totalPixels*(areaY-nowPosition)/(scrollCon.height-areaBg) +poleStartY;
		}


		/**
		 * 滑块滚动
		 */
		private function poleSprite(event : MouseEvent):void {
			//监听舞台,这样可以保证拖动滑竿的时候,鼠标在舞台的任意位置松手,都会停止拖动
			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:int=pole_sprite.y;
			//新位置
			var newY:int=ConNewY(nowPosition);
			//缓动效果,scrollCon.y的位置: scrollCon.y += ((计算出的新位置)-scrollCon.y)/缓动值
			scrollCon.y += (newY - scrollCon.y)/easingSpeed;

		}

		private function poleUp(event : MouseEvent):void {
			var nowPosition:int=pole_sprite.y;
			//弹起在次计算的原因是当鼠标弹起时移除了poleDown函数里的缓动效果,导致scrollCon没有到达计算位置。
			scrollCon.y=ConNewY(nowPosition);

			pole_sprite.stopDrag();
			scrollBar_sprite.removeEventListener(Event.ENTER_FRAME, poleDown);
			scrollBar_sprite.stage.removeEventListener(MouseEvent.MOUSE_UP, poleUp);
			//scrollCon.addEventListener(Event.SCROLL, textScroll);
		}

		/**
		 * 滑块背景点击
		 */
		private function bgDown(event : MouseEvent):void {
			var nowPosition:int;
			if ((scrollBar_sprite.mouseY-up_btn.y-up_btn.height) < (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;
			scrollCon.y=ConNewY(nowPosition);

		}

		/**
		 * 下滚动按钮
		 */
		private function downBtn(event : MouseEvent):void {
			if (scrollCon.y>(areaY+areaBg-scrollCon.height)) {
				scrollCon.y-=10;
				var nowPosition:int=scrollCon.y;
				pole_sprite.y=PoleNewY(nowPosition);
			}
			//当鼠标在按钮上按下的时间大于设定时间时,连续滚动
			putTime=getTimer();
			scrollBar_sprite.addEventListener(Event.ENTER_FRAME, downBtnDown);
		}

		private function downBtnDown(event : Event):void {
			if (getTimer()-putTime>500) {
				if (scrollCon.y>(areaY+areaBg-scrollCon.height)) {
					scrollCon.y-=1;
					var nowPosition:int=scrollCon.y;
					pole_sprite.y=PoleNewY(nowPosition);
				}
			}
		}

		private function downBtnUp(event : MouseEvent):void {
			scrollBar_sprite.removeEventListener(Event.ENTER_FRAME, downBtnDown);
		}

		/**
		 * 上滚动按钮
		 */
		private function upBtn(event : MouseEvent):void {
			if (scrollCon.y<areaY) {
				scrollCon.y+=10;
				var nowPosition:int=scrollCon.y;
				pole_sprite.y=PoleNewY(nowPosition);
			}
			//当鼠标在按钮上按下的时间大于设定时间时,连续滚动
			putTime=getTimer();
			scrollBar_sprite.addEventListener(Event.ENTER_FRAME, upBtnDown);
		}

		private function upBtnDown(event : Event):void {
			if (getTimer()-putTime>500) {
				if (scrollCon.y<areaY) {
					scrollCon.y+=1;
					var nowPosition:int=scrollCon.y;
					pole_sprite.y=PoleNewY(nowPosition);
				}
			}
		}

		private function upBtnUp(event : MouseEvent):void {
			scrollBar_sprite.removeEventListener(Event.ENTER_FRAME, upBtnDown);
		}

		/**
		 * 鼠标滚轮事件
		 */
		private function mouseWheel(event : MouseEvent):void {

			var nowPosition:int;
			if (event.delta<0) {
				if (scrollCon.y>(areaY+areaBg-scrollCon.height)) {
					scrollCon.y+=Math.floor(event.delta*3);
					nowPosition=scrollCon.y;
					pole_sprite.y=PoleNewY(nowPosition);
				}
			} else if (event.delta>0) {
				if (scrollCon.y<areaY) {
					scrollCon.y+=Math.floor(event.delta*3);
					nowPosition=scrollCon.y;
					pole_sprite.y=PoleNewY(nowPosition);
				}
			}

		}
	}
}
分享到:
评论
1 楼 zx92117002012 2012-08-23  
呵呵,不错!

相关推荐

    AS3 滚动条

    AS3滚动条是ActionScript 3.0编程语言中实现的一种用户界面元素,它主要用于在内容超出可视区域时提供导航。在AS3中,滚动条是通过Flash的UI组件库来创建和控制的,允许用户在长或宽的数据显示区域中进行上下或左右...

    flash元件滚动条(AS3.0)

    这个元件滚动条我用了将近两年了,2011年初我还在天地会论坛里发布过我的最初版本。在这两年时间里很多项目里都应用过,可以说是我经过了两年左右的不停完善,为了最大化的重复利用性,做了很多次大小改动。从最初...

    wincc7.4 sp1滚动条和全局库不显示的解决办法.docx

    在使用Siemens WinCC 7.4 SP1的过程中,用户可能会遇到滚动条和全局库不显示的问题,这会给项目的正常运行带来困扰。本篇将详细解释这个问题的原因,并提供相应的解决步骤。 首先,让我们理解问题的根源。WinCC是一...

    Axure表格中加入滚动条

    Axure表格中加入滚动条。表格的列很多,而页面宽度有限,但仍需将所有内容展示在表格内,考虑在表格中加入滚动条,教程可参考https://blog.csdn.net/super_DuoLa/article/details/126158919?spm=1001.2014.3001.5501...

    flash滚动条动态文本-源码

    在Flash编程领域,动态文本和滚动条的结合是常见的需求,尤其在展示大量文本内容时。这个"flash滚动条动态文本-源码"提供了一个经过调试且可直接使用的实例,适用于那些希望在Flash项目中集成类似功能的开发者。 ...

    Axure RP 8 带滚动条带筛选的下拉列表框 圆角文本框

    本知识点将深入探讨如何在Axure RP 8中实现带滚动条和筛选功能的圆角文本框,以及如何利用元件库来提高工作效率。 首先,让我们理解什么是"下拉列表框"。在UI设计中,下拉列表框是一种常用的输入控件,它允许用户从...

    as3 滚动条控制元件移动 带缓冲效果

    由于带滚动条的动态文本框无法竖着显示文字,于是通过把文本框转换成元件,遮罩层盖在内容层上,实现拉滚动条,元件左右移动,在遮罩层的帮助下,实现竖排文字左右移动的效果,然后通过代码加入移动的缓冲效果,注意...

    FLASH滚动条源码全集.7z

    源码可能展示了如何使用图形元件来创建滚动条的视觉元素,以及如何编写ActionScript来处理用户交互事件,如鼠标点击、拖动等。 3. **事件处理**:ActionScript中的事件监听器是实现滚动条功能的关键。例如,`...

    Axure设计之左右滚动组件教程(动态面板)

    Axure设计之左右滚动组件教程(动态面板)功能描述:1、点击“向左箭头”菜单导航向左移动,继续点击直到右侧显示全最后一个菜单时结束移动;2、点击“向右箭头”菜单导航向右移动,继续点击直到左侧显示全第一个...

    axure9元件库合集1

    它包含了一系列通用的交互元素,如滑块、滚动条、加载动画等,旨在满足各种设计需求。 WEB端组件3.0.rplib可能是另一个专注于Web界面设计的元件库,可能包含了最新的设计趋势和交互模式,方便设计师构建现代感十足...

    滚动条-任何位置:适用于Google Chrome的滚动条-Anywhere扩展-单击并拖动到任何位置以滚动

    滚动条随处可见 Google Chrome浏览器扩展程序,可以滚动页面,就像滚动条位于指针正下方一样。 只需按配置的鼠标按钮并移动鼠标即可。 如果要滚动样式,只需在选项中进行设置即可。 该扩展基于并受Firefox的...

    web元件库 ElementUI元件库

    元件库:包含导航、颜色、字体、边框、图标、按钮、文字链接、单选框、多选框、输入框、计数器、选择器、级联选择器、开关、滑块、时间选择器、日期选择器、日期时间选择器、上传、评分、颜色选择器、穿梭框、表单、...

    最全Axure元件库

    元件库中的100多个部件库,涵盖了常见的界面组件,如按钮、表单、滑块、开关、菜单、滚动条、日期选择器等。这些部件库经过精心设计,可以快速拖放至工作区,调整属性后即可使用,极大地提升了设计效率。此外,部件...

    Axsure RP7.0元件库

    这些元件可能包括按钮、表单元素、导航栏、滚动条、弹窗等,涵盖了软件界面设计的各个方面。使用这些扩展元件,设计师无需从零开始创建每个细节,节省了大量的时间和精力。 此外,元件库还包含了一系列常见图标元件...

    web元件库 ElementUI元件库+后台模板页面

    元件库:包含导航、颜色、字体、边框、图标、按钮、文字链接、单选框、多选框、输入框、计数器、选择器、级联选择器、开关、滑块、时间选择器、日期选择器、日期时间选择器、上传、评分、颜色选择器、穿梭框、表单、...

    Axure元件.zip

    5. **动态面板**:可用来创建可折叠内容、选项卡或模拟滚动效果,增加原型的动态感。 6. **表格和列表**:用于展示数据,可定制列宽、行高,甚至包含交互性。 7. **表单元素**:输入框、下拉列表、日期选择器等,...

    Axure元件库大全

    元件库通常包含各种类型的UI元素,如按钮、表单控件、图标、导航条、页眉和页脚、滚动条、滑块等,这些都经过精心设计,可以直接拖放到设计画布上,极大地提高了设计效率。此外,元件库还可能包括一些特定行业的组件...

    FLASH AS3.0实现自动滚动

    这种效果常见于滚动文本、滚动条或游戏中的滚动背景等场景。 描述中提到的“元件自由滚动功能”是指我们可以自定义任何类型的Flash元件(如影片剪辑或按钮)的行为,使其能够根据预设规则自动移动,营造出滚动的...

    axure完整元件库

    8. **动态面板**:可以用于实现滚动效果、选项卡切换等功能,是Axure RP中非常重要的一个特性。 9. **页面链接与变量**:通过链接设置,可以实现页面间的跳转;变量则可以存储和传递信息,为原型增加动态性。 10. ...

Global site tag (gtag.js) - Google Analytics