AS3循环滚动文字

AS3循环滚动文字

/**
 *
 * *-------------------*
 * |  *** 滚动文字 ***  |
 * *-------------------*
 *
 * 编辑修改收录:fengzi(疯子、wu341、wgq341)
 *
 * 不会写代码,我是代码搬运工。
 *
 * 联系方式:QQ(493712833)。
 *
 * 随   笔: https://www.cnblogs.com/fengziwu/
 *
 * 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
 * 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
 * 日   期: 2014.02.08
 *
 * * ------------------ Example -------------------- *
 *
 import fengzi.txtString.RollTxt;
 var txt:RollTxt=new RollTxt(150,true,15,14,0xFFFFFF,1)
 txt.setTxt("五十一各种往事中国可怜见解放环境开会交换机后交换机开会无理数难道",true)
 addChild(txt)
 */

package fengzi.txtString
{
	import flash.display.GradientType;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Matrix;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.events.MouseEvent;
	
	public class RollTxt extends Sprite
	{
		protected var txtW:int;
		protected var txt:TextField;
		protected var txtInfo:Object;
		
		private var txtFormat:TextFormat;
		
			
		private var txtMask:Sprite;
		private var txtHGap:int = 8;
		
		private var isGradient:Boolean = false;
		private var gradientDistance:int = 10;
		private var colors:Array = [];
		private var alphas:Array = [];
		private var ratios:Array = [];
		private var tempOffset:int = 38;
		private var matrix:Matrix;
		private var _speed:Number//滚动速度
		private var speed:Number
		
		/**
		 * 
		 * @param txtW              滚动文字的可视区域宽度
		 * @param isGradient        是否有渐变遮罩
		 * @param gradientDistance  渐变遮罩渐变色距离 (可以将.mask注释掉,查看效果)
		 * @param size              滚动文字大小
		 * @param color             滚动文字颜色
		 * @param kerning           字间距,默认不调整(调整请指定间距大于0)
		 * @param font              滚动文字字体
		 * @param bold              滚动文字是否加粗
		 * 
		 */		
		public function RollTxt(txtW:int , isGradient:Boolean , gradientDistance:int = 10, size:int = 12 , color:int = 0xffffff ,kerning:uint=0, font:String = "Verdana",bold:Boolean=false)
		{
			this.txtW = txtW;
			this.isGradient = isGradient;
			this.gradientDistance = gradientDistance;
			this.gradientDistance = ((this.gradientDistance  * 2 + tempOffset) >255)?(int((255 -tempOffset)/2)):this.gradientDistance
			this.tempOffset = ((this.gradientDistance  * 2 + tempOffset) >255)?(255 - this.gradientDistance  * 2 -10):this.tempOffset;
			
			if(isGradient)
			{
				colors = [0xffffff,0xffffff,0xffffff,0xffffff];
				alphas = [0,100,100,0];
				matrix = new Matrix();
				ratios = [0 , gradientDistance , 255 - gradientDistance - tempOffset , 255];            
			}
			
			
			txtFormat = new TextFormat();
			txtFormat.font = font;
			txtFormat.size = size;
			txtFormat.color = color;
			txtFormat.bold = bold;
			if (kerning>0)
			{
				txtFormat.kerning = true;
				txtFormat.letterSpacing = kerning;
			}
			
			txt = new TextField();
			txt.autoSize = TextFieldAutoSize.LEFT;
			txt.multiline = false;
			txt.wordWrap = false;
			txt.selectable = false;
			txt.mouseEnabled = txt.mouseWheelEnabled = false;
			addChild(txt);
			
			txt.defaultTextFormat = txtFormat;
			
			txtMask = new Sprite();
			addChild(txtMask);
			txt.mask = txtMask;
			
			txtInfo = {};
			
			
			
		}
		
		
		
		/**
		 * 实例RollTxt,调用setTxt开始滚动文字
		 * @param  value     滚动的文字
		 * @param  _speed    滚动速度
		 * @param  isMouse   鼠标移入时是否停止滚动
		 * 
		 */		
		public function setTxt(value:String,_speed:Number=0.5,isMouse:Boolean=true):void
		{
			this._speed=_speed
			speed=_speed
			if(hasEventListener(Event.ENTER_FRAME))
			{
				removeEventListener(Event.ENTER_FRAME , enterHandler);
				txt.x = 0;
			}
			
			txtInfo.txtNum = 0;
			txtInfo.txtSingleW = null;
			
			txt.text = value;
			txtInfo.txtSingleW = txt.textWidth;
			txt.text = "";
			
			var tempW:int = (txtInfo.txtSingleW > txtW )?txtInfo.txtSingleW:txtW;
			while(txt.textWidth < tempW * 2)
			{
				txt.appendText(value);
				txtInfo.txtNum ++;
			}
		    
			creatMask();
			
			txtInfo.txtNum = Math.floor(txtInfo.txtNum/2);
			txtInfo.endPosition = - txtInfo.txtNum * txtInfo.txtSingleW;  
			if(isMouse){
				this.addEventListener(MouseEvent.MOUSE_OVER,onOverHandler)
			}
			start();
			
		}
		
		private function onOverHandler(event:MouseEvent):void{
			speed=0
			this.addEventListener(MouseEvent.MOUSE_OUT,onOutHandler)
		}
		private function onOutHandler(event:MouseEvent):void{
			speed=_speed
			txt.removeEventListener(MouseEvent.MOUSE_OUT,onOutHandler)
		}
		
		private function creatMask():void
		{
			if(isGradient)
			{
				matrix.createGradientBox(txtW, (txt.textHeight + txtHGap), Math.PI/1, 0, 0 );
				txtMask.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix );
				txtMask.graphics.drawRect(0, -txtHGap/2, txtW, (txt.textHeight + txtHGap));
				txtMask.graphics.endFill();
				txtMask.cacheAsBitmap = true;
				txt.cacheAsBitmap = true;
			}
			else
			{
				txtMask.graphics.clear();
				txtMask.graphics.beginFill(0x00ffff,0.45);
				txtMask.graphics.drawRect(0,-txtHGap/2,txtW,(txt.textHeight + txtHGap));
				txtMask.graphics.endFill();
			}
		}
		
		protected function enterHandler(e:Event):void
		{
			txt.x -=speed;
			if(txt.x <= txtInfo.endPosition)
			{
				txt.x = 0;
			}
		}
		
		private function start():void
		{
			addEventListener(Event.ENTER_FRAME , enterHandler);
		}
		
		
		public override function get width():Number
		{
			return txtW;
		}
		
		public override function get height():Number
		{
			return txt.textHeight + txtHGap;
		}
	}
}

  

原文地址:https://www.cnblogs.com/fengziwu/p/13702591.html