倒影类:
package com.flashdev.bitmap ...{
/**//*
Written by:
Dustin Andrew
dustin@flash-dev.com
www.flash-dev.com
LAST UPDATED:
01/24/06
Reflection.as
Create a bitmap reflection of a displayobject
*/
import flash.display.*;
import flash.geom.*;
import flash.events.*;
public class Reflection extends Sprite ...{
private var _disTarget:DisplayObject;
private var _numStartFade:Number = .3;
private var _numMidLoc:Number = .5;
private var _numEndFade:Number = 0;
private var _numSkewX:Number = 0;
private var _numScale:Number = 1;
private var _bmpReflect:Bitmap;
// Constructor
public function Reflection(set_disTarget:DisplayObject, set_numStartFade:Number, set_numMidLoc:Number, set_numEndFade:Number, set_numSkewX:Number, set_numScale:Number) ...{
super()
_disTarget = set_disTarget;
_numStartFade = set_numStartFade;
_numMidLoc = set_numMidLoc;
_numEndFade = set_numEndFade;
_numSkewX = set_numSkewX;
_numScale = set_numScale;
_bmpReflect = new Bitmap(new BitmapData(1, 1, true, 0));
this.addChild(_bmpReflect);
createReflection();
}
// Create reflection
private function createReflection(event:Event = null):void ...{
// Reflection
var bmpDraw:BitmapData = new BitmapData(_disTarget.width, _disTarget.height, true, 0);
var matSkew:Matrix = new Matrix(1, 0, _numSkewX, -1 * _numScale, 0, _disTarget.height);
var recDraw:Rectangle = new Rectangle(0, 0, _disTarget.width, _disTarget.height * (2 - _numScale));
var potSkew:Point = matSkew.transformPoint(new Point(0, _disTarget.height));
matSkew.tx = potSkew.x * -1;
matSkew.ty = (potSkew.y - _disTarget.height) * -1;
bmpDraw.draw(_disTarget, matSkew, null, null, recDraw, true);
// Fade
var shpDraw:Shape = new Shape();
var matGrad:Matrix = new Matrix();
var arrAlpha:Array = new Array(_numStartFade, (_numStartFade - _numEndFade) / 2, _numEndFade);
var arrMatrix:Array = new Array(0, 0xFF * _numMidLoc, 0xFF);
matGrad.createGradientBox(_disTarget.width, _disTarget.height, 0.5 * Math.PI);
shpDraw.graphics.beginGradientFill(GradientType.LINEAR, new Array(0,0,0), arrAlpha, arrMatrix, matGrad)
shpDraw.graphics.drawRect(0, 0, _disTarget.width, _disTarget.height);
shpDraw.graphics.endFill();
bmpDraw.draw(shpDraw, null, null, BlendMode.ALPHA);
_bmpReflect.bitmapData.dispose();
_bmpReflect.bitmapData = bmpDraw;
_bmpReflect.filters = _disTarget.filters;
this.x = _disTarget.x;
this.y = (_disTarget.y + _disTarget.height) - 1;
}
}
}
测试类:
package ...{
import com.flashdev.bitmap.*;
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.filters.*;
public class ReflectionTest extends Sprite ...{
// Constructor
public function ReflectionTest() ...{
// Setup stage
this.stage.align = StageAlign.TOP_LEFT;
this.stage.scaleMode = StageScaleMode.NO_SCALE;
// Load image
var loadImg:Loader = new Loader();
loadImg.contentLoaderInfo.addEventListener(Event.COMPLETE, onImgLoaded);
loadImg.load(new URLRequest("image.jpg"));
}
// Called when image is loaded
private function onImgLoaded(event:Event):void ...{
var sprImg:Sprite = new Sprite();
// Attach image
var disImg:DisplayObject = event.target.content;
var filGlow:GlowFilter = new GlowFilter(0x000000, .3, 8, 8, 1, 3, false, false);
disImg.filters = [filGlow];
sprImg.addChild(disImg);
// Add reflection
var sprReflect:Reflection = new Reflection(disImg, .4, .2, 0, 0, 1);
sprImg.addChild(sprReflect);
// Center
sprImg.x = (this.stage.stageWidth - sprImg.width) / 2;
sprImg.y = (this.stage.stageHeight - sprImg.height) / 2;
this.addChild(sprImg);
}
}
}