自定义动画效果(Iris动画修改)

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

        
    }

}

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

                
            }

        }

    }



}

 

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 >
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值