`
strugglesMen
  • 浏览: 115254 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Flex动画效果与变换(二)

阅读更多
转自:http://xinsync.xju.edu.cn/index.php/archives/1305


   很多开发者都并不满足Flex里提供的简单的渐 变大小,透明,移动,遮罩等的效果,如果是Flash的开发者的话,更不用说了,在Flash,多数人都是随意的制作一些动画效果等,而且形态多变。但是 不是Flex里就不能实现呢?肯定不是,在Flex里也可以自定义动画效果,只不过就是没有Flash里面那么简单随意了。不过熟悉了之后,也会觉得在 Flex里制作动画也不是什么难事,不多说了,转入正题!
在这里我先介绍一下Flex里面的动画效果机制,在Flex里面要使用动画效果的话,先要创建一个效果标签,之后在组件里(如TextInput)写上效果触发器,但可能会有人问,如果程序里我就只定义一个移动效果< mx:Move>,之后我程序里面有5个组件,每个组件的动画效果都指向这个Move效果,那么它是不是组件一运行了效果后,组件二再触发效果,是 不是组件一的效果会消失才会到组件二里播放?其实它不是,虽然我们只定义了一个Move,但我们定义的只是Move效果的工厂,这里就用到了设计模式中的 “工厂方法”模式,其实5个组件都可以同时运行效果,而5个效果都是不同的一个实例,彼此独立。所谓工厂方法模式,就好比是一家衣服制造工厂,A走进这家 工厂说要一件衣服,工厂就制作一件合适A的Size的衣服,B进去,就会生产合适B的衣服,但A与B的衣服都是一样的。就好等于面向对象中的类与对象的关 系一样。
效果运行的时候,其实运行的不是Move这个对象,而是MoveInstance这个对象,Move只是工厂,既然一个动画效果就主要分这两大部份,我们就先建造一个工厂吧!
在Flex里面所有的效果的工厂都是继承自 mx.effects.Effect 这个类,我们也不能搞特殊,我们自定义的效果也要继承那个类,先看以下整个工厂类的代码:
package com.jiangzone.flex.effects { 
import mx.effects.Effect; 
import mx.effects.EffectInstance; 
public class MyEffect extends Effect { 
private var _color:Number = 0xFF0000; 
public function set color(value:Number):void { 
_color = value; 
} 
public function MyEffect(newTarget:Object = null) { 
super(newTarget); 
instanceClass = MyEffectInstance; 
} 
override public function getAffectedProperties( ):Array { 
return []; 
} 
override protected function initInstance(instance:EffectInstance):void { 
super.initInstance(instance); 
MyEffectInstance(instance).color = _color; 
} 
} 
} 

大家看看上面的代码,其中先看构造函数,构造函数要接收一个默认为空的Object对象
public function MyEffect(newTarget:Object = null) 之 后在该构造函数里面调用父类的构造函数,并且将instanceClass这个属性设置为你的该效果的实例类,因为这个类是工厂类,所以要知道你这个工厂 生产什么产品,即上面说的“衣服”,所以这里我们将其命名为MyEffectInstance,注意:在Flex中的所有效果实例类都是在工厂类后面加 Instance,也不是一定,只是规范而已。还有注意,下面一会定义的实例类的类名一定要跟这里的一致。
大家还会看到,上面的代码中,复写(override)了二个方法:getAffectedProperties( )与initInstance(instance:EffectInstance)
这两个方法都是要复写的,先说说getAffectedProperties( )这个方法,这个方法是获取被改变的属性值,怎么说呢,比如说,你做的动画效果如果要用到组件对象的一些属性的话,就要返回这些属性的名字,如:你的效果是对组件做旋转的话,则:
override public function getAffectedProperties( ):Array { 
return ["rotation"]; 
} 

反正你做的效果需要对组件修改什么属性的话,都在这个方法里返回名字,修改多个属性的话就往数组里加就是了。
后面就是这个方法了initInstance,该方法接收一个instance:EffectInstance参数,也就是效果实例类啦,因为每个效果实例 类都要继承EffectInstance类,所以这个方法里的参数写的是父类,在里面要做其它的话,需要将 instance 转换为你相应的效果类。在这个方法里面,也是要调用父类的同名方法:super.initInstance(instance);
基本上,一个工 厂类就写好了,但这样只是最简单的写法,试想想,每个人穿衣服的Size不同,喜欢的颜色也不同,所以,是不是可以由用户来定义他们想要的效果的颜色等属 性呢?当然,你对衣服有什么要求,都是向工厂提出的,没有人会对衣服说吧?所以,这些可设置的属性也是定义在工厂类里面,所以下面,我们为该衣服可定制颜 色为例,在工厂类里面加入如下代码:
private var _color:Number = 0xFF0000; 
public function set color(value:Number):void { 
_color = value; 
} 

你想运行时的效果可以设置不同的颜色的话,就可以直接设置MyEffect的color属性,之后将这个属性传给效果实例类:
override protected function initInstance(instance:EffectInstance):void { 
super.initInstance(instance); 
MyEffectInstance(instance).color = _color; 
} 

这些对效果实例类的设置,都是要定在initInstance方法里了,你想对运行时的效果设置什么属性的话,都要先告诉工厂类,之后工厂类在这个方法里面转嫁给实例类,这样,同一个效果,可以运行不同的颜色。但前提是你后面要写的实例类要有color这个属性。
现在已做好了工厂类了,下面要做效果实例类了,先贴出完整代码:
package com.jiangzone.flex.effects { 
import mx.effects.EffectInstance; 
import flash.display.Shape; 
import flash.events.Event; 
public class MyEffectInstance extends EffectInstance { 
private var _color:Number; 
private var shape:Shape; 
public function set color(value:Number):void { 
_color = value; 
} 
public function MyEffectInstance(newTarget:Object) { 
super(newTarget); 
} 
override public function play( ):void { 
super.play( ); 
drawShape(); 
} 
private function drawShape():void{ 
shape = new Shape(); 
shape.graphics.beginFill(_color); 
shape.graphics.drawRect(target.width * -0.5,target.height * -0.5,target.width,target.height); 
shape.graphics.endFill(); 
shape.x = target.x + target.width * 0.5; 
shape.y = target.y + target.height * 0.5; 
target.parent.rawChildren.addChild(shape); 
target.addEventListener(Event.ENTER_FRAME,onEnterFrame); 
} 
private function onEnterFrame(e:Event):void{ 
shape.scaleX += 0.1; 
shape.scaleY += 0.1; 
shape.alpha -= 0.05; 
if(shape.alpha <= 0){ 
target.parent.rawChildren.removeChild(shape); 
target.removeEventListener(Event.ENTER_FRAME,onEnterFrame); 
} 
} 
} 
} 

我 们看到,每一个动画效果实例类,都要继承自EffectInstance这个类,构造函数也是需要接收一个Object,这个Object其实就是你要应 用到的组件对象,这个会是系统自动传递的,接收了Object后还要用该Object 调用父类的构造函数:super(newTarget);
之后还有一件必做的事,就是重写play()这个方法:override public function play( ):void 是不是对play()很熟悉?因为第一篇文章中,就用到这个方法来发动效果的播放的,所以,你需要做的动画编程都是在这个方法里。但还是要先调用父类的同名 方法,super.play(); 之后的就是你想怎么画就怎么画啦。我将画一个与要应用效果的组件一样大小的矩型,之后该矩形会放大并透明,效果都写在 drawShape()方法里了。看到这个方法里面的代码,是不是跟Flash里的一样了?
这里再贴上MXML代码:
<?xml version=”1.0″ encoding=”utf-8″?> 
<mx:Application layout=”absolute” xmlns:mx=”http://www.adobe.com/2006/mxml” 
xmlns:pf=”com.jiangzone.flex.effects.*”> 
<pf:MyEffect id=”myEffect” color=”0xFFFFFF” /> 
<mx:VBox x=”100″ y=”43″> 
<mx:TextInput focusInEffect=”{myEffect}” /> 
<mx:TextInput focusInEffect=”{myEffect}” /> 
<mx:TextInput focusInEffect=”{myEffect}” /> 
<mx:TextInput focusInEffect=”{myEffect}” /> 
</mx:VBox> 
</mx:Application> 

这里先看看最终效果:在线播放
在 这里,我用了ENTER_FRAME的写法,但是如果不用ENTER_FRAME方式制作动画的话,还有另外一种方法的,那就是Tween了,Tween 是以“时间”为准,而ENTER_FRAME是以“帧”为准,其实到这里,一个基本的Flex自定义动画效果就完成了,但扩展一下的,还可以用Tween 来实现,而且建议用Tween来写动画效果,易控制,清淅一点。用Tween实现的话,效果与写法都是差不多的,要用Tween就要将效果实例类继承自 TweenEffectInstance这个类,并重写它的onTweenUpdate( )方法与onTweenEnd( )方法,这种Tween效果的写法,将会比ENTER_FRAME的写法方便,因为它根据的是时间,所以,你可以指定效果播放的时间,并且当播放完毕会自 动调用onTweenEnd()方法,你可以在该方法里写一些处理操作,如释放资源等等;由于编幅关系,就不在这里详细介绍TweenEffectInstence了,就简单贴出该类的写法与注释吧:
package com.jiangzone.flex.effects { 
import mx.effects.effectClasses.TweenEffectInstance; 
import flash.display.Shape; 
import flash.events.Event; 
import mx.effects.Tween; 
public class MyEffectInstance extends TweenEffectInstance { 
private var _color:Number; 
private var shape:Shape; 
public function set color(value:Number):void { 
_color = value; 
} 
//构造函数 
public function MyEffectInstance(newTarget:Object) { 
super(newTarget); 
} 
//同样的要重写play()方法与调用父类同名方法 
override public function play( ):void { 
super.play(); 
drawShape(); //先创建一个矩形 
/*注意:用Tween效果写法的话,就一定要创建一个Tween对象; 
第一个参数是侦听器,即侦听Update与End的,这两个方法都在这个类里,所以这里就写this; 
第二和第三个参数都是一个数组;二个参数是初始值数组,第三个是结果值数组,都要一一对应,第四个是变化时间; 
这里的是[1,1]分别是初始时的scale比例与alpha,[3,0]就是最终结果数值;系统会自动在1000毫秒里平分这些值来得到渐变效果;并将每一次数值的改变时调用Update方法,结束后调用End方法;你也可以将时间的参数发布到工厂类属性里,可以方便设置播放时间,像Flex自带效果一样 
*/ 
new Tween(this,[1,1],[3,0],1000); 
} 
override public function onTweenUpdate(value:Object):void{ 
//这里将改变的数值应用到组件对象中。注意:也要与上面的数值数组相对应。 
shape.scaleX = Number(value[0]); 
shape.scaleY = Number(value[0]); 
shape.alpha = Number(value[1]); 
} 
override public function onTweenEnd(value:Object):void { 
//当播放完时会自动调用该方法,这里就做删除该矩形的操作吧 
target.parent.rawChildren.removeChild(shape); 
} 
private function drawShape():void{ 
shape = new Shape(); 
shape.graphics.beginFill(_color); 
shape.graphics.drawRect(target.width * -0.5,target.height * -0.5,target.width,target.height); 
shape.graphics.endFill(); 
shape.x = target.x + target.width * 0.5; 
shape.y = target.y + target.height * 0.5; 
target.parent.rawChildren.addChild(shape); 
} 
} 
} 
分享到:
评论

相关推荐

    flex中动画效果

    在 Flex 3.0 中,动画效果是增强用户体验的关键特性之一,允许开发者通过编程方式实现多种视觉变换,使得用户界面更加生动和吸引人。 在 Flex 中,动画效果主要通过 `Effect` 类来实现,它们可以应用于组件或容器,...

    flex动画效果与变幻.pdf

    #### 二、Flex动画的基本概念 在Flex中,动画可以通过内置的效果库(Effects)来实现,也可以通过自定义的方式来创建更复杂的动画效果。Flex提供的内置效果包括但不限于模糊(Blur)、移动(Move)、淡入淡出(Fade...

    Flex 布局变化时的动画效果解析 简单版

    这篇博客“Flex布局变化时的动画效果解析 简单版”可能是作者对如何在Flex布局中实现动态变换的一种简明介绍。 首先,我们需要理解Flex布局的基础概念。在Flex布局中,容器被设置为`display: flex`,它的子元素称为...

    FLEX4动画特效

    描述中的“样例集合”意味着这个压缩包可能包含了多种不同类型的动画,比如淡入淡出、滑动、旋转、缩放、颜色变换等,这些都是Flex4动画系统中常见的特效。Flex4引入了新的动画模型——Timeline Animation和Effect ...

    flex翻书效果 flex翻书效果

    总结,实现Flex翻书效果涉及到了Flexbox布局、CSS3动画、3D变换以及JavaScript事件处理等多个技术点。通过巧妙地组合这些技术,可以创建出高度交互和沉浸式的用户体验。在实际开发中,我们需要考虑浏览器兼容性、...

    Flex2的几个行为动画源码

    7. **NewIris**: "Iris"通常与相机镜头的缩放或展开有关,这可能是一个关于视图变换或过渡效果的示例,例如缩放、平移或旋转。 8. **ParallelExample**: 并行行为允许同时运行多个动画。在Flex2中,你可以创建一个...

    Flex 3D切换效果

    总的来说,"Flex 3D切换效果"是通过巧妙地运用ActionScript 3.0的3D特性、变换和动画机制来实现的。掌握这些技术,不仅能够提升Flex应用的用户体验,也有助于开发出更具创新性和吸引力的用户界面。在实际项目中,...

    flex3d效果展示

    在文件名“Flex3d动画引擎_效果展示”中,我们可以推断出这是一个关于Flex3D动画引擎的示例或教程,可能包含了如何创建和控制3D动画的详细步骤,以及如何实现特定效果的代码片段。学习这样的资源,开发者可以更好地...

    flex 做的控件翻转动画效果

    在本文中,我们将深入探讨如何使用Adobe Flex技术创建控件翻转动画效果。Flex是一种基于MXML和...通过理解`Animate`、`Effect`以及相关的3D变换类,开发者可以自由地定制和扩展动画效果,以满足不同应用场景的需求。

    Flex开门,关门,翻转,效果

    在Flex中,可以使用TransitionManager或者直接在MXML组件中定义动画来实现这种效果。TransitionManager提供了一系列预定义的过渡效果,如滑动、淡入淡出等,可以方便地应用于组件的显示和隐藏。此外,开发者也可以...

    flex coverflow 效果示例

    3. **3D变换与矩阵运算**: 实现Coverflow效果的关键在于3D变换。Flex支持使用Matrix3D类来进行复杂的3D操作,包括旋转、缩放和位移。开发者需要计算每个元素相对于中心点的3D位置,并通过Matrix3D应用这些变换。当...

    flex写的变形效果

    本话题聚焦于使用Flex实现的“变形效果”,这通常涉及到图形和元素在用户交互下的动态变换。 Flex Builder是Adobe公司提供的一个集成开发环境(IDE),专门用于开发Flex应用。它提供了代码编辑、调试、性能分析等...

    Flex 放大镜效果

    8. **Tweening**:为了提供平滑的动画效果,可以使用Tween库,如GreenSock Animation Platform (GAP) 或 Flex的内置TweenLite,来平滑地改变放大镜的位置和大小。 9. **皮肤自定义**:Flex允许开发者自定义组件外观...

    flex3D效果

    开发者可能使用了Flex SDK或Adobe Flex Builder来创建和编译这些代码,以实现3D图像的动态加载、交互控制和动画效果。 2. **3D模型和纹理**:为了创建3D图片浏览效果,项目可能包含了一些3D模型文件,如*.obj或*....

    Flex3D效果图片浏览器

    总的来说,Flex3D效果图片浏览器是一个利用Adobe Flex技术开发的创新性应用,它将3D图形技术与图片浏览相结合,通过Stage3D API实现了高效的硬件加速3D渲染,使用户能够在多维度上欣赏图片,提升了图片浏览的趣味性...

    flex 超炫的3d效果+源码

    源代码分析对于初学者来说极其宝贵,因为它们展示了实际项目中如何组织和使用这些3D库,以及如何将3D元素与Flex的UI组件相结合。 在压缩包中,"更多精美素材.htm"可能是一个包含额外资源链接或者介绍的网页,而...

    Flex4.5做的3D网页效果展示墙

    在Flex中,开发者可能利用Stage3D技术或者第三方库如Away3D来创建鱼眼效果,通过对像素的处理和投影变换来实现这种扭曲的视觉效果。 总的来说,这个项目展示了Flex4.5和As3在3D网页效果方面的强大能力,不仅能够...

    Flex 3D圆形隧道效果

    4. **动画和时间线**:为了创建动态的3D隧道效果,我们需要使用Animate3D动作或Timeline类来控制3D对象的运动。例如,通过连续改变3D对象的旋转角度,可以模拟物体沿着隧道壁旋转的效果。 5. **光照和材质**:在3D...

    flex 苹果鱼眼效果及win7窗体效果

    【标题】"Flex苹果鱼眼效果及Win7窗体效果" 在Flex开发中,实现独特的视觉体验是提升用户界面吸引力的重要手段。本话题主要探讨如何在Flex应用中创建苹果风格的鱼眼效果以及Windows 7样式的窗口效果。这两项特效...

Global site tag (gtag.js) - Google Analytics