Filter Workbench 应用程序包含一个类集,各可用滤镜均有一个对应的类,各面板用这些类来创建滤镜。用户选定滤镜后,与滤镜面板相关联的 ActionScript 代码就将创建相应滤镜工厂类的实例。(这些类称为
工厂类
,因为其用途在于创建其他对象的实例,这与实际工厂创建各产品极为相似)
只要用户更改面板上的属性值,面板的代码就会调用工厂类中的相应方法。各工厂类包含面板用于创建相应滤镜实例的特定方法。例如,如果用户选择“模糊”滤镜,则应用程序将创建 BlurFactory 实例。BlurFactory 类包含一个
modifyFilter()
方法,该方法接受三个参数:
blurX
、
blurY
和
quality
,这三个参数一起用于创建所需的 BlurFilter 实例:
private var _filter:BlurFilter;
public function modifyFilter(blurX:Number = 4, blurY:Number = 4, quality:int = 1):void
{
_filter = new BlurFilter(blurX, blurY, quality);
dispatchEvent(new Event(Event.CHANGE));
}
另一方面,如果用户选择“卷积”滤镜,因为该滤镜允许更大的灵活性,所以需要控制的属性就会更多。在 ConvolutionFactory 类中,如果用户在滤镜面板上选择不同的值,则将调用以下代码:
private var _filter:ConvolutionFilter;
public function modifyFilter(matrixX:Number = 0,
matrixY:Number = 0,
matrix:Array = null,
divisor:Number = 1.0,
bias:Number = 0.0,
preserveAlpha:Boolean = true,
clamp:Boolean = true,
color:uint = 0,
alpha:Number = 0.0):void
{
_filter = new ConvolutionFilter(matrixX, matrixY, matrix, divisor, bias, preserveAlpha, clamp, color, alpha);
dispatchEvent(new Event(Event.CHANGE));
}
请注意,在各例中,如果滤镜值发生变化,则工厂对象将调度
Event.CHANGE
事件,从而向侦听器通知滤镜的值已经改变。将滤镜实际应用于过滤内容的 FilterWorkbenchController 类将侦听该事件,以确定何时需检索滤镜的新副本并将其重新应用于过滤的内容。
FilterWorkbenchController 类无需知道各滤镜工厂类的特定详细信息,它只需知道滤镜已更改,并能够访问滤镜副本即可。为支持此目的,应用程序包含了一个 IFilterFactory 接口,该接口定义滤镜工厂类需提供的行为,以便应用程序的 FilterWorkbenchController 实例能够完成自己的工作。IFilterFactory 定义在 FilterWorkbenchController 类中使用的
getFilter
() 方法:
function getFilter():BitmapFilter;
请注意,
getFilter()
接口方法定义指定该方法返回一个 BitmapFilter 实例,而非特定类型的滤镜。BitmapFilter 类不定义特定类型的滤镜,而是用来构建所有滤镜类的基类。各滤镜工厂类定义
getFilter()
方法的特定实现,此时将返回对所创建滤镜对象的引用。例如,以下就是 ConvolutionFactory 类源代码的缩写版本:
public class ConvolutionFactory extends EventDispatcher implements IFilterFactory
{
// ------- Private vars -------
private var _filter:ConvolutionFilter;
...
// ------- IFilterFactory implementation -------
public function getFilter():BitmapFilter
{
return _filter;
}
...
}
ConvolutionFactory 类在实现
getFilter()
方法时将返回一个 ConvolutionFilter 实例,尽管调用
getFilter()
的任何对象无需知道此返回结果。根据 ConvolutionFactory 所遵循的
getFilter()
方法的定义,此方法必须返回任意 BitmapFilter 实例,这些实例可能是任意 ActionScript 滤镜类的实例。