NewIrisEffert.as
package
tree
...
{
//导入代码中使用的对象
import mx.effects.MaskEffect;
import mx.effects.EffectInstance;
import mx.controls.SWFLoader;
import flash.display.Shape;
import flash.geom.Rectangle;
import mx.core.FlexShape;
import flash.display.Graphics;
public class NewIrisEffect extends MaskEffect...{
//表明动画采用的起始点类型
public var position:String; //这个参数非常有用!
//构造函数
public function NewIrisEffect(target:Object=null)...{
super(target);
//定义实例类型为NewIrisInstance,代替原来的IrisInstance.NewIrisInstance是我们新建的对像。
instanceClass=NewIrisInstance;
//定义新的createMaskFunction,此函数用来绘制遮罩层
this.createMaskFunction=createLargeMask;
}
//此函数用来绘制遮罩层
public function createLargeMask(targ:Object,bounds:Rectangle):Shape...{
//绘制前,首先得到目标的实际尺寸,来确定遮罩层的尺寸。targetVisualBounds包含了目标可视区域的长和宽
var targetWidth:Number = bounds.width / Math.abs(targ.scaleX);
var targetHeight:Number = bounds.height / Math.abs(targ.scaleY);
if (targ is SWFLoader)...{
//
targ.validateDisplayList();
if(targ.content)...{
targetWidth = targ.contentWidth;
targetHeight = targ.contentHeight;
}
}
//创建遮罩层的表现对象
var newMask:Shape=new FlexShape();
var g:Graphics=newMask.graphics;
//设定填充色
g.beginFill(0xFFFF00);
//绘制椭圆,drawEllipse是Griphics对象的绘制方法之一,默认情况下绘制矩形
g.drawEllipse(0,0,targetWidth,targetHeight);
g.endFill();
//判断是否跳转
if(target.rotation==0)...{
//如果没有跳转
newMask.width=targetWidth;
newMask.height=targetHeight;
}else...{
//如果跳转,重新计算遮罩层的大小
//得到角度的弧度数
var angle:Number=targ.rotation * Math.PI/180;
var sin:Number=Math.sin(angle);
var cos:Number=Math.cos(angle);
//计算出新尺寸
newMask.width=Math.abs(targetWidth * cos-targetHeight * sin);
newMask.height=Math.abs(targetWidth * sin + targetHeight * cos);
}
return newMask;
}
//覆盖父类的initInstance方法
//将生成类的属性传到实例对象中,这个方法在对象内部被调用
override protected function initInstance(instance:EffectInstance):void...{
//调用父类的同名方法
super.initInstance(instance);
//创建新的实例
var maskEffectInstance:NewIrisInstance=NewIrisInstance(instance);
//传递参数给实例
maskEffectInstance.showTarget=showTarget;
maskEffectInstance.xFrom=xFrom;
maskEffectInstance.yFrom=yFrom;
maskEffectInstance.xTo=xTo;
maskEffectInstance.yTo=yTo;
maskEffectInstance.scaleXFrom=scaleXFrom;
maskEffectInstance.scaleXTo=scaleXTo;
maskEffectInstance.scaleYFrom=scaleYFrom;
maskEffectInstance.scaleYTo=scaleYTo;
//确定动画执行的初使位置
maskEffectInstance.position=position;
}
}
}
//导入代码中使用的对象
import mx.effects.MaskEffect;
import mx.effects.EffectInstance;
import mx.controls.SWFLoader;
import flash.display.Shape;
import flash.geom.Rectangle;
import mx.core.FlexShape;
import flash.display.Graphics;
public class NewIrisEffect extends MaskEffect...{
//表明动画采用的起始点类型
public var position:String; //这个参数非常有用!
//构造函数
public function NewIrisEffect(target:Object=null)...{
super(target);
//定义实例类型为NewIrisInstance,代替原来的IrisInstance.NewIrisInstance是我们新建的对像。
instanceClass=NewIrisInstance;
//定义新的createMaskFunction,此函数用来绘制遮罩层
this.createMaskFunction=createLargeMask;
}
//此函数用来绘制遮罩层
public function createLargeMask(targ:Object,bounds:Rectangle):Shape...{
//绘制前,首先得到目标的实际尺寸,来确定遮罩层的尺寸。targetVisualBounds包含了目标可视区域的长和宽
var targetWidth:Number = bounds.width / Math.abs(targ.scaleX);
var targetHeight:Number = bounds.height / Math.abs(targ.scaleY);
if (targ is SWFLoader)...{
//
targ.validateDisplayList();
if(targ.content)...{
targetWidth = targ.contentWidth;
targetHeight = targ.contentHeight;
}
}
//创建遮罩层的表现对象
var newMask:Shape=new FlexShape();
var g:Graphics=newMask.graphics;
//设定填充色
g.beginFill(0xFFFF00);
//绘制椭圆,drawEllipse是Griphics对象的绘制方法之一,默认情况下绘制矩形
g.drawEllipse(0,0,targetWidth,targetHeight);
g.endFill();
//判断是否跳转
if(target.rotation==0)...{
//如果没有跳转
newMask.width=targetWidth;
newMask.height=targetHeight;
}else...{
//如果跳转,重新计算遮罩层的大小
//得到角度的弧度数
var angle:Number=targ.rotation * Math.PI/180;
var sin:Number=Math.sin(angle);
var cos:Number=Math.cos(angle);
//计算出新尺寸
newMask.width=Math.abs(targetWidth * cos-targetHeight * sin);
newMask.height=Math.abs(targetWidth * sin + targetHeight * cos);
}
return newMask;
}
//覆盖父类的initInstance方法
//将生成类的属性传到实例对象中,这个方法在对象内部被调用
override protected function initInstance(instance:EffectInstance):void...{
//调用父类的同名方法
super.initInstance(instance);
//创建新的实例
var maskEffectInstance:NewIrisInstance=NewIrisInstance(instance);
//传递参数给实例
maskEffectInstance.showTarget=showTarget;
maskEffectInstance.xFrom=xFrom;
maskEffectInstance.yFrom=yFrom;
maskEffectInstance.xTo=xTo;
maskEffectInstance.yTo=yTo;
maskEffectInstance.scaleXFrom=scaleXFrom;
maskEffectInstance.scaleXTo=scaleXTo;
maskEffectInstance.scaleYFrom=scaleYFrom;
maskEffectInstance.scaleYTo=scaleYTo;
//确定动画执行的初使位置
maskEffectInstance.position=position;
}
}
}
NewIrisInstance.as
package
tree
...
{
import mx.effects.effectClasses.MaskEffectInstance;
import mx.controls.SWFLoader;
public class NewIrisInstance extends MaskEffectInstance...{
//新添加的参数,用来确定动画播放时的初使位置
public var position:String; //这个参数非常有用!
//构造函数
public function NewIrisInstance(target:Object)...{
super(target);
}
//覆盖父类的方法,initMaskEffect主要初使化遮罩动画的信息
override protected function initMaskEffect():void...{
//调用父类的同名方法
super.initMaskEffect();
//得到目标的实际尺寸,targetVisualBounds包含了目标可视区域的长和宽
var targetWidth:Number = targetVisualBounds.width / Math.abs(target.scaleX);
var targetHeight:Number = targetVisualBounds.height / Math.abs(target.scaleY);
//如果目标是SWFLoader对象,则计算加载内容的尺寸,而不是目标本身的尺寸
if (target is SWFLoader)...{
targetWidth = target.contentWidth;
targetHeight = target.contentHeight;
}
//如果showTarget为true,表示显示目标对象
if (showTarget)...{
//定义x,y方向的起始放缩值
scaleXFrom = 0;
scaleYFrom = 0;
scaleXTo = 1;
scaleYTo = 1;
//依据position属性决定起点的位置
//如果中心是左上角
if(position=="leftTop")...{
//从左上角开始
//targetVisualBounds还包含了目标可视区域的可视域的坐标位置
xFrom = targetVisualBounds.x;
yFrom = targetVisualBounds.y;
}else if(position=="rightBottom")...{
//如果中心是右下角,从右下角开始
xFrom = targetWidth + targetVisualBounds.x;
yFrom = targetHeight + targetVisualBounds.y;
}else...{
//从默认中心开始,保持原来的计算方式不变
xFrom = targetWidth / 2 + targetVisualBounds.x;
yFrom = targetHeight / 2 + targetVisualBounds.y;
}
//确定最后的坐标
xTo = targetVisualBounds.x;
yTo = targetVisualBounds.y;
}else...{
//如果是隐藏目标
scaleXFrom = 1;
scaleYFrom = 1;
scaleXTo = 0;
scaleYTo = 0;
//目标的起始位置
xFrom = targetVisualBounds.x;
yFrom = targetVisualBounds.y;
//确定最后的坐标
if(position=="leftTop")...{
xFrom = targetVisualBounds.x;
yFrom = targetVisualBounds.y;
}else if(position=="rightBottom")...{
xFrom = targetWidth + targetVisualBounds.x;
yFrom = targetHeight + targetVisualBounds.y;
}else...{
xTo = targetWidth / 2 + targetVisualBounds.x;
yTo = targetHeight / 2 + targetVisualBounds.y;
}
}
}
}
}
import mx.effects.effectClasses.MaskEffectInstance;
import mx.controls.SWFLoader;
public class NewIrisInstance extends MaskEffectInstance...{
//新添加的参数,用来确定动画播放时的初使位置
public var position:String; //这个参数非常有用!
//构造函数
public function NewIrisInstance(target:Object)...{
super(target);
}
//覆盖父类的方法,initMaskEffect主要初使化遮罩动画的信息
override protected function initMaskEffect():void...{
//调用父类的同名方法
super.initMaskEffect();
//得到目标的实际尺寸,targetVisualBounds包含了目标可视区域的长和宽
var targetWidth:Number = targetVisualBounds.width / Math.abs(target.scaleX);
var targetHeight:Number = targetVisualBounds.height / Math.abs(target.scaleY);
//如果目标是SWFLoader对象,则计算加载内容的尺寸,而不是目标本身的尺寸
if (target is SWFLoader)...{
targetWidth = target.contentWidth;
targetHeight = target.contentHeight;
}
//如果showTarget为true,表示显示目标对象
if (showTarget)...{
//定义x,y方向的起始放缩值
scaleXFrom = 0;
scaleYFrom = 0;
scaleXTo = 1;
scaleYTo = 1;
//依据position属性决定起点的位置
//如果中心是左上角
if(position=="leftTop")...{
//从左上角开始
//targetVisualBounds还包含了目标可视区域的可视域的坐标位置
xFrom = targetVisualBounds.x;
yFrom = targetVisualBounds.y;
}else if(position=="rightBottom")...{
//如果中心是右下角,从右下角开始
xFrom = targetWidth + targetVisualBounds.x;
yFrom = targetHeight + targetVisualBounds.y;
}else...{
//从默认中心开始,保持原来的计算方式不变
xFrom = targetWidth / 2 + targetVisualBounds.x;
yFrom = targetHeight / 2 + targetVisualBounds.y;
}
//确定最后的坐标
xTo = targetVisualBounds.x;
yTo = targetVisualBounds.y;
}else...{
//如果是隐藏目标
scaleXFrom = 1;
scaleYFrom = 1;
scaleXTo = 0;
scaleYTo = 0;
//目标的起始位置
xFrom = targetVisualBounds.x;
yFrom = targetVisualBounds.y;
//确定最后的坐标
if(position=="leftTop")...{
xFrom = targetVisualBounds.x;
yFrom = targetVisualBounds.y;
}else if(position=="rightBottom")...{
xFrom = targetWidth + targetVisualBounds.x;
yFrom = targetHeight + targetVisualBounds.y;
}else...{
xTo = targetWidth / 2 + targetVisualBounds.x;
yTo = targetHeight / 2 + targetVisualBounds.y;
}
}
}
}
}
NewIris.mxml
<?
xml version="1.0" encoding="utf-8"
?>
< mx:Application xmlns:mx ="http://www.adobe.com/2006/mxml" layout ="absolute" xmlns:tree ="tree.*" >
<!-- 定义动画效果 -->
< tree:NewIrisEffect position ="leftTop" id ="myIris" duration ="1000" ></ tree:NewIrisEffect >
<!-- 动画效果绑定在图片上 -->
< mx:Image x ="10" y ="10" source ="img/5.jpg" width ="125" height ="190" id ="image" showEffect ="{myIris}" hideEffect ="{myIris}" />
< mx:Button x ="36" y ="227" label ="播放" click ="image.visible=!image.visible" />
</ mx:Application >
< mx:Application xmlns:mx ="http://www.adobe.com/2006/mxml" layout ="absolute" xmlns:tree ="tree.*" >
<!-- 定义动画效果 -->
< tree:NewIrisEffect position ="leftTop" id ="myIris" duration ="1000" ></ tree:NewIrisEffect >
<!-- 动画效果绑定在图片上 -->
< mx:Image x ="10" y ="10" source ="img/5.jpg" width ="125" height ="190" id ="image" showEffect ="{myIris}" hideEffect ="{myIris}" />
< mx:Button x ="36" y ="227" label ="播放" click ="image.visible=!image.visible" />
</ mx:Application >