AS3 动态模糊效果类

package org.util
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;

	/**
	 * PS 效果类
	 * @author Jave.Lin
	 * 
	 */	
	public class PSEffectUtil
	{
		public static var stageFrameRate:Number=12;
		//动态模糊
		public static function motionBlur(disObj:Bitmap,duration:Number=2000,onCompleteCallback:Function=null):void
		{
//			if(disObj==null)return;//throw new Error('PSEffectUtil.action(disObj) disObj==null!!!!');
//			
//			if(disObj.stage==null)return;//throw new Error('PSEffectUtil.action(disObj) disObj.stage==null!!!!');
			
			var scaleXY:Number;
			var rota:Number;
			var rotaAdd:Number;
			var rotaVec:Number;
			
			var singleFrameElapsed:Number;
			var renderCount:int;
			var renderedCount:uint;
						
			var bmpData:BitmapData=new BitmapData(disObj.width,disObj.height);
			bmpData.draw(disObj);
			var disObjBitmap:Bitmap=new Bitmap(bmpData);
			
			var isSetVars:Boolean=false;
			
			function onEnterFrameHandler(e:Event):void
			{
				if(!isSetVars)
				{
					isSetVars=true;
					
					scaleXY=1;
					rota=disObj.rotation;
					rotaAdd=0.05;
					rotaVec=rotaAdd/5;
					
					singleFrameElapsed=1000/stageFrameRate;
					renderCount=duration/singleFrameElapsed;
					renderedCount=0;
				}
				if(renderedCount>renderCount)
				{
					disObj.removeEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
					if(onCompleteCallback!=null)onCompleteCallback();
					return;
				}
				renderedCount++;
				
				var addR:Number=rotaAdd;
				rotaAdd+=rotaVec;
				if(renderedCount>renderCount/2)
				{
					rota += addR;
				}
				scaleXY *= 1.05;
				var m:Matrix = new Matrix();
				m.translate(-bmpData.width / 2,-bmpData.height / 2);
				m.scale(scaleXY,scaleXY);
				m.rotate(rota);
				m.translate(bmpData.width / 2,bmpData.height / 2);
				disObj.bitmapData.draw(bmpData,m,new ColorTransform(1,1,1,0.2),BlendMode.DARKEN);
			}
			disObj.removeEventListener(Event.ENTER_FRAME,onEnterFrameHandler);	
			disObj.addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);	
		}
		
		public static function motionLoopRedColorTransform(disObj:DisplayObject,duration:Number=2000,redOffsetTarget:Number=255,onCompleteCallback:Function=null):void
		{
//			if(disObj==null)return;//throw new Error('PSEffectUtil.motionLoopRedColorTransform(disObj) disObj==null!!!!');
//			
//			if(disObj.stage==null)return;//throw new Error('PSEffectUtil.motionLoopRedColorTransform(disObj) disObj.stage==null!!!!');
			
			var singleFrameElapsed:Number;
			var renderCount:int;
			var renderedCount:uint;
			var redInterval:Number;
			var redAdd:Number;
			
			var isSetVars:Boolean=false;
			
			function onEnterFrameHandler(e:Event):void
			{
				if(!isSetVars)
				{
					isSetVars=true;
					singleFrameElapsed=1000/stageFrameRate;
					renderCount=duration/singleFrameElapsed;
					renderedCount=0;
					redInterval=0;
					redAdd=0;
				}
				
				if(renderedCount>renderCount)
				{
					disObj.removeEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
					if(onCompleteCallback!=null)onCompleteCallback();
					return;
				}
				renderedCount++;
//				trace('renderedCount:'+renderedCount);
				
				var ctf:ColorTransform=disObj.transform.colorTransform;
				redInterval=redOffsetTarget-ctf.redOffset;
//				trace('ctf.redOffset:'+ctf.redOffset);
//				trace('redInterval:'+ctf.redOffset);
				redAdd=(redInterval*(renderedCount/renderCount));
//				trace('redAdd:'+redAdd);
				ctf.redOffset+=redAdd;
//				trace('ctf.redOffset:'+ctf.redOffset);
				disObj.transform.colorTransform=ctf;
//				trace('disObj.transform.colorTransform:'+disObj.transform.colorTransform.redOffset);
			}
			disObj.removeEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
			disObj.addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);	
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值