10.5.应用简单的滤镜

问题
我想加入些滤镜效果,如阴影,模糊,光晕,倒角
解决办法
构造一个filter对象,然后赋值给可视化对象的filters数组
讨论
flash.filters 包包含了下列基础滤镜类:DropShadowFilter, BlurFilter, GlowFilter, BevelFilter,GradientGlowFilter,和GradientBevelFilter。把它们归结为基础的滤镜是因为它们不需要格外添加一些显示对象作为表明映射和矩阵等复杂转换之用。每个滤镜都有一些简单的属性组成,例如DropShadowFilter类可以自己设置阴影偏移,颜色,模糊量等属性。

构造好了滤镜对象后就可以赋值给对象的filters属性了。filters属性是一个滤镜对象数组,下面的例子应用了一个阴影滤镜到sampleSprite上:
+展开
-ActionScript
sampleSprite.filters = [new DropShadowFilter( )];

当我们把滤镜数组赋值给可视化对象时,赋值的是数组拷贝而不是引用,因此如果修改了滤镜数组后必须重新赋值,否则无效果,看下面的例子:
+展开
-ActionScript
var dropShadow:DropShadowFilter = new DropShadowFilter( );
var sampleFilters:Array = [dropShadow];
//应用滤镜
sampleSprite.filters = sampleFilters;
//改变阴影颜色,但是赋值给对象的滤镜拷贝还是原来的颜色,因此需要重新赋值
dropShadow.color = 0xFFFFFF;
//添加光晕效果,需要重新赋值
sampleFilters.push(new GlowFilter( ));
//重新赋值
sampleSprite.filters = sampleFilters;

当我们读取显示对象的filters属性时,它返回滤镜数组的拷贝,这意味着不能用直接对对象的filters属性进行修改:
+展开
-ActionScript
var dropShadow:DropShadowFilter = new DropShadowFilter( );
// 应用阴影滤镜
sampleSprite.filters = [dropShadow];
// 没有添加光晕滤镜.
sampleSprite.filters.push(new GlowFilter( ));
// 正确的做法是取得滤镜数组,添加新滤镜,再重新赋值回去
var sampleFilters:Array = sampleSprite.filters;
sampleFilters.push(new GlowFilter( ));
sampleSprite.filters = sampleFilters;

滤镜效果是一层一层叠加上去的,例如,有个滤镜数组有两个滤镜:阴影滤镜和光晕滤镜(光晕滤镜在第二个位置),当第一个滤镜应用后,第二个滤镜应用在原始对象和第一个滤镜之上。

如果你不想让滤镜产生叠加,必须每个滤镜都应用到对象的拷贝上,思考下下面的例子,光晕滤镜应用到整个表明,包括阴影和原始对象,这不是我们所期望的,我们是希望每个滤镜效果都只影响原始对象而不是产生叠加。
+展开
-ActionScript
var box:Sprite = new Sprite( );
box.graphics.lineStyle( );
box.graphics.beginFill(0xFFFFFF);
box.graphics.drawRect(0, 0, 100, 100);
box.graphics.endFill( );
addChild(box);
box.filters = [new DropShadowFilter(10), new GlowFilter( )];

下面画了两个矩形,分别应用光晕和阴影效果,其中阴影滤镜的knockout属性设为TRue:
+展开
-ActionScript
var box:Sprite = new Sprite( );
box.graphics.lineStyle( );
box.graphics.beginFill(0xFFFFFF);
box.graphics.drawRect(0, 0, 100, 100);
box.graphics.endFill( );
var boxShadow:Sprite = new Sprite( );
boxShadow.graphics.lineStyle( );
boxShadow.graphics.beginFill(0xFFFFFF);
boxShadow.graphics.drawRect(0, 0, 100, 100);
boxShadow.graphics.endFill( );
addChild(boxShadow);
addChild(box);
box.filters = [new GlowFilter( )];
boxShadow.filters = [new DropShadowFilter(10, 45, 0, 1, 4, 4, 1, 1, falsetrue)];

knockout 属性用于隐藏原始图形,例如,设置阴影滤镜的knockout属性后显示出来只有阴影本身,这一点非常有用,这样我们就能产生不叠加的滤镜组合了。

要想清楚显示对象上的滤镜效果,通过赋值个空数组或null即可:
+展开
-ActionScript
sampleSprite.filters = [];

加支付宝好友偷能量挖...


评论(0)网络
阅读(101)喜欢(0)flash/flex/fcs/AIR