首页 > 设计 > WEB开发 > 正文

12.6.创建渐变特效

2023-07-22 12:39:19
字体:
来源:转载
供稿:网友
12.6.1 问题
我想要创建一个自定义的渐变效果,此类效果播放的时候在指定的持续时间内慢慢的改变它的属性。
12.6.2 解决办法
继承TweenEffect 和TweenEffectInstance 类创建一个工厂对象和一个传给每个目标的由工厂生成的类。
12.6.3 讨论
Effect 和TweenEffect 显著的区别在于TweenEffect 需要一段时间播放。TweenEffect 的开始属性和结束属性传入到EffectInstance 内,它使用这些属性在一段时间内对目标对象创建、添加新的过滤器实例或者改变目标对象的属性。通过在TweenInstance 类里使用一个mx.effects.Tween 对象来在持续的一段时间内生成属性值的变化效果。

这一小节将展示如何建立一个简单的渐变效果,根据赋值到TweenEffect 类的duration 属性使它目标对象的透明度淡出。Tween 对象,像效果一样,也是由两个类组成,比如:一个为每个传入TweenEffect 的target 生成TweenInstance 实例的TweenEffect 工厂类,和一个创建Tween 对象并使用Tween 对象的值生成持续时间内效果的TweenInstance 对象。

先看看TweenEffect:
+展开
-ActionScript
package oreilly.cookbook{
import mx.effects.TweenEffect;
public class CustomTweenEffect extends TweenEffect
{
public var finalAlpha:Number = 1.0;
public function CustomTweenEffect (target:Object=null) {
super(target);
}
public function
CustomDisplacementEffect(target:Object=null){
super(target);
this.instanceClass = CustomTweenInstance;
}
//create our new instance
override protected function
initInstance(instance:IEffectInstance):void {
super.initInstance(instance);
// now that we've instantiated our instance, we can set
its properties
CustomTweenInstance(instance).finalAlpha =
this.finalAlpha;
}
override public function getAffectedProperties():Array {
trace(" return all the target properties ");
return [];
}
}
}

当实例化TweenInstance 对象的时候,设置用以传入initInstance 方法的每个CustomTweenInstance 对象的finalAlpha 属性。

CustomTweenInstance 类继承TweenEffectInstance 类并覆盖该类的play 和onTweenUpdate 方法。覆盖的play 方法包含例示Tween 对象的逻辑,该对象即为生成TweenEffect 持续属性变化的Tween:
+展开
-ActionScript
override public function play():void {
super.play();
this.tween = new Tween(this, 0, finalAlpha, duration);
(target as DisplayObject).alpha = 0;
}

从CustomTweenEffect 里传入finalAlpha 和duration 属性,同时mx.effects.Tween 会为SWF的每帧生成一个值,从初始值(这里是0)平滑地移动,直至最终值(这里是finalAlpha 变量)。

如果需要可以给Tween 对象传入多值数组,只要初始值数组的元素个数和终止值数组的元素个数相同即可。TweenEffectInstance 的play 方法,在这里通过super.play 调用,为onTweenUpdate 方法添加侦听到Tween 上。通过覆盖此方法,你可以给TweenEffectInstance添加任何自定义逻辑。
+展开
-ActionScript
override public function onTweenUpdate(value:Object):void {
(target as DisplayObject).alpha = value as Number;
}

这里target 的alpha 属性设置成Tween 变量返回的值,慢慢的将target 的alpha 属性值变化为finalValue 变量值:
+展开
-ActionScript
package oreilly.cookbook{
import flash. display.DisplayObject;
import mx.effects.effectClasses.TweenEffectInstance;
public class CustomTweenInstance extends TweenEffectInstance
{
public var finalAlpha:Number;
public function NewTweenInstance(target:Object) {
super(target);
}
override public function play():void {
super.play();
this.tween = new Tween(this, 0, finalAlpha, duration);
(target as DisplayObject).alpha = 0;
}
override public function onTweenUpdate(value:Object):void {
(target as DisplayObject).alpha = value as Number;
}
}
}

每次调用onTweenUpdate 的时候,都要重新计算alpha 值并更新target。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表