`
dydytd3400
  • 浏览: 22954 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

利用FLEX 4中的Animate来自定义effect 特效

阅读更多
此次AJSPlayer的开发过程中,由于将会使用到大量的,高度自定义的特效,而Flex 4中原始提供的封装特效组件(如Move、Rotate、Fade,甚至包含对应的3D特效等等)已经不能满足我们的需求了,而这个时候就需要来自定义一些effect特效。

在Flex 4里,effect特效可以应用于任意类型的对象和属性(Interpolator是这一环节中较为关键的一个东西,Adobe称之为‘补插器’,后面将会有详细介绍),这是Flex 4为我们带来的最炫目的新特性之一。

Flex4里的所有特效类都继承于Animate,而Animate同时还继承于Effect。Flex4里的特效类的层次是与Flex3大不相同,它提供了更强大,自由度更高的特效定义。当然,同时也变得更为复杂。

首先,我们以Move特效做为例子来了解一下Flex 4中的特效。
Flex 4中的Move特效继承于AnimateTransform,而AnimateTransform同时又继承于Animate。
我们通过注释可以看到这样一句话:“Animate 效果可设置各个值之间的任意属性集的动画。通过设置 motionPaths 属性,指定要设置动画的属性和值。”

motionPaths(MotionPath类型的数组)又是什么?它的字面意思是“运动路径”,查看MotionPath源码注释又看到这样的解释:“MotionPath 类定义效果的 Keyframe 对象的集合,以及要设置动画的目标上属性的名称。每个 Keyframe 对象都定义位于效果过程中某个特定时间的属性的值。这样,效果就可以通过在两个关键帧所指定的值之间进行插补来计算目标属性的值。”
从上面大致可以看出,MotionPath就是类似于flash中补间动画的东西,它的工作则是将我们给他所指定一个对象或属性名称(property),并按照分配的时间和property的初始值与结束值定义一个补间动画。通常情况下,MotionPath会假定你所指定的property是数值类型的,如果不是则需要你为它指定一个Interpolator(上文提到的补插器)。

重点来了。Interpolator是IInterpolator的一个实现,FLEX 4定义了几种Interpolator,包括NumberInterpolator、RGBInterpolator、HSBInterpolator、MultiValueInterpolator。而我们最常用的则是前面两个。animate在播放时,会自动的去调用这些插补器来计算出MotionPath的关键帧,实现动画效果,通常我们是不需要定义的。但是,有时候,比如,我们希望物体能做圆周运动,这个时候我们通常的做法是利用timer去不断的更新根据公式所计算出来的xy坐标。而自定义一个Interpolator则可以更方便的为我们解决这一问题。

看下面OvalInterpolator.as的代码:
<pre lang="ActionScript3">package
{
import mx.resources.IResourceManager;
import mx.resources.ResourceManager;

import spark.effects.interpolation.IInterpolator;
import spark.effects.interpolation.NumberInterpolator;

public class OvalInterpolator extends NumberInterpolator
{
private var _width:Number;
private var _height:Number;
private var _type:String;
private var _centerPrintX:Number;
private var _centerPrintY:Number;
public function OvalInterpolator(type:String)
{
super();
_type=type;
}
/**
*  @private
*  Used for accessing localized Error messages.
*/
private var resourceManager:IResourceManager =
ResourceManager.getInstance();
override public function interpolate(fraction:Number, startValue:Object, endValue:Object):Object
{
if (fraction == 0)
return startValue;
else if (fraction == 1)
return endValue;
if ((startValue is Number &amp;&amp; isNaN(Number(startValue))) ||
(endValue is Number &amp;&amp; isNaN(Number(endValue))))
throw new Error(resourceManager.getString("sparkEffects", "cannotCalculateValue", [startValue, endValue]));
return computeInterpolate(Number(startValue) + (fraction * (Number(endValue) - Number(startValue))));
}
private function computeInterpolate(angle:Number):Number{
switch(_type)
{
case "x":
{
return (_centerPrintX+ _width - _width * Math.cos((angle) * Math.PI / 180));
}
case "y":
{
return (_centerPrintY+ _height * Math.sin((angle) * Math.PI / 180));
}

default:
{
throw new Error(resourceManager.getString("sparkEffects", "不被预知的参数类型", [_type]));
}
}
}

public function get width():Number
{
return _width;
}

public function set width(value:Number):void
{
_width = value;
}

public function get height():Number
{
return _height;
}

public function set height(value:Number):void
{
_height = value;
}

public function get type():String
{
return _type;
}

public function get centerPrintX():Number
{
return _centerPrintX;
}

public function set centerPrintX(value:Number):void
{
_centerPrintX = value;
}

public function get centerPrintY():Number
{
return _centerPrintY;
}

public function set centerPrintY(value:Number):void
{
_centerPrintY = value;
}

}
}</pre>
其实很容易就明白,interpolate的三个参数分别为:进度的百分百,初始值,结束值。MotionPath在调用这一接口方法的时候,会自动根据动画的播放进度传入适当的值,我们需要做的则是提供根据这三个参数所计算的进度返回的适当值。
接着,我们只需要将这个插补器指定给我们需要的Animate的MotionPath就行。

而前面所提到AnimateTransform的工作其实就是为我们定义并封装了motionPaths,并且按照根据需要实现特效的属性指定对应类别的插补器,相当于为其做了一个“归类”的操作。Flex 4中的所有封装的顶层特效,都有与AnimateTransform类似,但是管理着不同类型或种类的对象及属性的父类,他们都会将其做为一个实例赋给Animate,以实现严格的归类特效。

也许文字描述过于抽象或枯燥,下面看完整demo代码:
MyAnimate.as
<pre lang="ActionScript3">package
{
import mx.controls.Alert;
import mx.effects.IEffectInstance;
import mx.events.EffectEvent;

import spark.components.mediaClasses.VolumeBar;
import spark.effects.Animate;
import spark.effects.animation.MotionPath;
import spark.effects.animation.SimpleMotionPath;
import spark.effects.interpolation.IInterpolator;

public class MyAnimate extends Animate {
private var propertys:Vector.=new Vector.;
public function MyAnimate (target:Object=null) {
super(target);
motionPaths = new Vector.;
}

public function  addMotionPath(property:String,valueFrom:Object,valueTo:Object,interpolator:IInterpolator=null):void{
propertys.push(property);
var motionPath:SimpleMotionPath = new SimpleMotionPath(property);
motionPath.valueFrom = valueFrom;
motionPath.valueTo = valueTo;
motionPath.property=property;
if(interpolator){
motionPath.interpolator=interpolator;
}
motionPaths.push(motionPath);
}
}
}</pre>
demo.mxml
<pre lang="ActionScript3">
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
   xmlns:s="library://ns.adobe.com/flex/spark"
   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init()" xmlns:local="*">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import spark.effects.Move3D;
import spark.effects.Resize;
import spark.effects.Rotate3D;
private function init():void{
var ovalInterpolatorx:OvalInterpolator = new OvalInterpolator("x");
ovalInterpolatorx.width=150;
ovalInterpolatorx.centerPrintX=300;

var ovalInterpolatory:OvalInterpolator = new OvalInterpolator("y");
ovalInterpolatory.height=150;
ovalInterpolatory.centerPrintY=300;

customEffect.addMotionPath("x",0,360,ovalInterpolatorx);
customEffect.addMotionPath("y",0,360,ovalInterpolatory);
customEffect.end();
}

]]>
</fx:Script>
<fx:Declarations>
<local:TrajectoryAnimate id="customEffect" duration="5000" target="{btn2}" />
</fx:Declarations>
<s:BorderContainer width="100%" height="100%">
<s:Button label="Click to fade in the button below"   click="customEffect.play()"/>
<s:Button id="btn2" x="10" y="32" width="77" height="54" label="Oval" alpha="0.2"
  fontSize="50"/>
</s:BorderContainer>
</s:Application>

</pre>

PS:AJSPlayer的研发日志将会在第一时间发表在本人sae的博客上,测试demo也会放在上面,如有兴趣的请移驾http://dzlg.sinaapp.com
分享到:
评论

相关推荐

    Flex4 特效源码,很不错

    例如,我们可以使用Fade、Slide等效果来实现元素的透明度变化和位置移动,也可以利用Animate类来自定义复杂的动画路径。 对于PopupEffect,可能涉及的技术点包括: 1. **效果的触发与控制**:通过ActionScript或...

    Flex4 滑动菜单案例

    在这个"Flex4 滑动菜单案例"中,我们将探讨如何利用Flex4的组件和特效来实现一个动态的滑动菜单。 滑动菜单是用户界面设计中的常见元素,它可以提供更高效的导航,特别是在内容丰富的应用中。在Flex4中,我们可以...

    Flex 果冻特效Demo

    在Flex中实现果冻特效,主要涉及以下几个关键知识点: 1. **ActionScript**:Flex的核心编程语言是ActionScript,它是基于ECMAScript的一个面向对象的语言。在果冻特效中,我们需要通过ActionScript编写动画逻辑,...

    flex特效代码

    Animate类是Flex中最常用的特效类之一,它允许开发者创建自定义的动画。Animate类支持多种属性的动画,如x、y坐标、宽度、高度、颜色等。开发者可以使用Tween类来实现平滑变化,或者直接使用AnimateColor、...

    Flex 的特效代码,学flex的特效更容易

    Flex中的Animate类是实现动态效果的核心,它能够改变组件的属性,如位置、大小、颜色等。Transition则是预定义的一组Animate实例,可以轻松地在两个组件状态之间切换,例如显示和隐藏组件。 3. **Easing函数** ...

    animate动画特效重复调用

    在标题和描述中提到的“animate动画特效重复调用”,指的是在编程时可能会遇到的动画序列的连续执行或者循环播放的情况。 首先,我们来详细了解一下`animate()`的基本语法: ```javascript $(selector).animate({...

    flex 特效demo

    在Flex中,我们可以使用Animate类来创建基本的动画效果。例如,平移、旋转、缩放等可以通过设置Animate对象的属性来实现。同时,Tween类提供了更简单的缓动功能,它可以帮助我们轻松地在两个值之间平滑过渡。此外,...

    flex制作的旋转色块验证特效

    在Flex中实现这样的特效,开发者需要掌握以下几个关键知识点: 1. **Flex基础知识**:理解Flex的基本架构,包括MXML和ActionScript 3.0。MXML是Flex的标记语言,用于定义UI组件的布局和结构,而ActionScript 3.0是...

    animate动画特效

    animate动画特效animate动画特效html5 css

    动画库animate.css文字特效.zip

    1. **CSS动画**:CSS动画是通过CSS3中的`@keyframes`规则创建的,它允许在元素的不同时间点定义不同的样式,从而产生平滑的过渡效果。Animate.css库简化了这一过程,提供了预定义的动画效果。 2. **Animate.css**:...

    导航折叠特效(flex3)

    4. ** 动画效果**:为了让折叠过程更加平滑,可以使用Flex3的Animate类或Transitions类添加过渡效果。这些效果可以控制组件在展开和折叠时的速度、方向和其他视觉属性。 5. ** 图片和视觉元素**:在提供的压缩包中...

    animate.css动画特效

    Animate.css包含了数十种预定义的动画类别,覆盖了入场、出场、持续和自定义等多种类型。 在使用Animate.css时,首先需要将animate.css文件下载到你的项目目录中。通常,我们会将它放在CSS文件夹下,然后在HTML文件...

    逐一显示animate.css特效.rar

    Animate.css是一个广泛使用的开源CSS库,它包含了丰富的动画效果,可以轻松地添加到网页项目中,为元素添加各种视觉吸引力。这个"逐一显示animate.css特效.rar"文件显然提供了结合JavaScript实现的一个解决方案,...

    animate.min.css动画特效

    Animate.css库包含了一系列预先定义的动画类别,涵盖了诸如淡入淡出、滑动、旋转、缩放等多种效果。这些动画可以应用于页面加载、用户交互、导航过渡等场景,极大地提升了用户体验和网页的视觉吸引力。 在Animate....

    flex特效范例源码

    在Flex中实现这些特效,通常会涉及到DisplayObject的transform属性,如Matrix和ColorTransform,以及动画类,如Tween和Animate。 Flex中的数据绑定是其一大特色,它允许UI组件与后台数据模型进行自动同步,极大地...

    Flex模拟Mac特效

    总之,通过学习和运用以上知识点,开发者可以在Flex中实现Mac风格的弹出框特效,提供用户一种熟悉且引人入胜的交互体验。在实际项目中,可能还需要考虑性能优化、错误处理和维护性等方面,确保应用的质量和稳定性。

    Flex4.0API中文手册完整版

    6. **动画和效果**:Flex 4.0引入了Animate和Effect框架,允许开发者创建复杂的动画效果,增强了用户体验。 7. **服务和数据访问**:通过HTTPService、WebService、AMFChannel等,开发者可以轻松地与服务器进行数据...

    flex4 开发文档

    6. **动画和效果**:讲解Flex 4中的动画机制,包括使用Animate和Transition类创建复杂的视觉效果。 7. **服务和通信**:讨论如何使用HTTPService、WebService、AMFChannel等与服务器进行数据交换,以及如何集成第三...

    Flex 4 进度条的皮肤

    在Flex 4中,皮肤是界面组件外观的关键元素,可以自定义以满足特定设计需求。进度条是用户界面中常见的组件,用于表示任务的完成程度或加载状态。本文将深入探讨如何在Flex 4中创建和定制进度条的皮肤。 首先,我们...

Global site tag (gtag.js) - Google Analytics