最近在OrgChart中加入了一个放大镜的功能,使用的是[b]FLEX 3.2[/b]之后的一个新的功能,嵌入[url="http://labs.adobe.com/wiki/index.php/Pixel_Bender_Toolkit"]Pixel Bender Toolkit [/url]写的滤镜。顺便把实现的代码贴出来大家共享一下。滤镜文件在附件。
///////////////////////////////////////////////////////////////////////////////////
// 放大镜功能
///////////////////////////////////////////////////////////////////////////////////
private var useMagnifier:Boolean = false;
private function magnifierTool():void{
if(useMagnifier){
useMagnifier = false;
magnifier.toolTip = "打开放大镜";
stage.removeEventListener( Event.ENTER_FRAME, onEnterFrame);
orgChartContainer.filters = [];
if(resizeEffect.isPlaying){
resizeEffect.stop();
}
resizeEffect.heightTo = 0;
resizeEffect.play([settingContainer]);
}else{
useMagnifier = true;
magnifier.toolTip = "关闭放大镜";
stage.addEventListener( Event.ENTER_FRAME, onEnterFrame, false, 0, true );
if(resizeEffect.isPlaying){
resizeEffect.stop();
}
resizeEffect.heightTo = 130;
resizeEffect.play([settingContainer]);
}
}
[Embed(source="assets/magnify.pbj", mimeType="application/octet-stream")]
private var shaderObj:Class;
private var shader:Shader;
private var shaderFilter:ShaderFilter;
/**
* Initialize the shader
*/
private function initShader():void{
// create the shader
shader = new Shader( new shaderObj() );
shader.data.center.value = [orgChartContainer.width/2, orgChartContainer.height/2];
//setShader();
}
/**
* Each frame, only reapply the filter if necessary
*/
private function onEnterFrame( event:Event ):void{
setShader();
}
/**
* Update all the shader's properties, create a new ShaderFilter,
* and reapply it to the orgChartContainer
*/
private function setShader():void{
var centerX:Number = orgChartContainer.mouseX;
var centerY:Number = orgChartContainer.mouseY;
if( centerX < 0 || centerY < 0 || centerX > orgChartContainer.width || centerY > orgChartContainer.height )
{
var currentX:Number = shader.data.center.value[0];
var currentY:Number = shader.data.center.value[1]
centerX = currentX + ((orgChartContainer.width / 2)-currentX) / 2;
centerY = currentY + ((orgChartContainer.height / 2)-currentY) / 2;
}
shader.data.center.value = [centerX, centerY];
shader.data.innerRadius.value = [innerRadiusSlider.value];
shader.data.outerRadius.value = [outerRadiusSlider.value];
shader.data.magnification.value = [magnificationSlider.value];
shaderFilter = new ShaderFilter( shader );
orgChartContainer.filters = [shaderFilter];
}