www.pudn.com > photoFlow_AS3_001.rar > ReflectionEffect.as
package com.flashloaded.as3.effects{
import com.flashloaded.as3.Photo;
import com.flashloaded.as3.effects.Effect;
import com.flashloaded.as3.Points;
//
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Matrix;
import flash.display.GradientType;
import flash.display.SpreadMethod;
import flash.utils.setInterval;
import flash.utils.clearInterval;
import flash.display.Sprite;
import flash.events.Event;
public class ReflectionEffect extends Effect{
private var selectedPoints:Points;
private var notSelectedPointsLeft:Points;
private var notSelectedPointsRight:Points;
private var gradient:Sprite;
private var updateInt:Number;
private var distance:Number = 0;
private var bounds:Object;
private var bitmapData:BitmapData;
private var bitmap:Bitmap;
//
private var fillType:String=GradientType.LINEAR;
private var colors:Array=[0xffffff,0xffffff];
private var currAlpha:Number;
private var talpha:Number;
private var tratio:Number;
private var ratio:Number;
private var spreadMethod:String=SpreadMethod.PAD;
private var side:String;
public function ReflectionEffect(target:Photo){
super(target);
}
public function initPoints():void{
selectedPoints=new Points(0,ph+hpers,pw+extend*2,ph+hpers,pw+extend,hpers,extend,hpers);
notSelectedPointsLeft=new Points(extend,ph+hpers,pw-vpers+extend,ph-hpers*(1-view),pw-vpers+extend,hpers*view,extend,hpers);
notSelectedPointsRight=new Points(extend,ph-hpers*(1-view),pw-vpers+extend,ph+hpers,pw-vpers+extend,hpers,extend,hpers*view);
distort.image.y=photo.photoHeight-hpers;
distort.image.x=-extend;
gradient=new Sprite();
gradient.cacheAsBitmap =true;
}
public function transform(side:String):void{
this.side=side;
if(!photo.selected){
tratio=notSelectedRatio;
talpha=notSelectedAlpha;
}else{
tratio=selectedRatio;
talpha=selectedAlpha;
}
if(side=="right"){
transformMotionTo(notSelectedPointsRight);
}else if(side=="left"){
transformMotionTo(notSelectedPointsLeft);
}else{
transformMotionTo(selectedPoints);
}
//trace(distort.image.x);
}
public function transformTo(side:String):void{
this.side=side;
if(side=="center"){
transformImage(selectedPoints);
}else if(side=="right"){
transformImage(notSelectedPointsRight);
}else{
transformImage(notSelectedPointsLeft);
}
//init
bitmapData=new BitmapData(reflectWidth,reflectHeight,true,0xffffff);
bitmapData.draw(distort.image);
if(photo.selected){
ratio=tratio=selectedRatio;
talpha=currAlpha=selectedAlpha;
}else{
ratio=tratio=notSelectedRatio;
talpha=currAlpha=notSelectedAlpha;
}
resetGradient();
bitmap=new Bitmap(bitmapData);
gradient.y=bitmap.y=distort.image.y;
gradient.x=bitmap.x=-extend;
photo.addChild(bitmap);
bitmap.cacheAsBitmap=true;
photo.addChild(gradient);
bitmap.mask=gradient;
distort.image.visible=false;
}
override protected function motion(e:Event=null):void{
super.motion(e);
resetBitmap();
}
public function resetGradient():void{
var matr:Matrix = new Matrix();
var p:Points=photo.points;
var dx:Number=p.getX(2)-p.getX(3);
var dy:Number=p.getY(2)-p.getY(3);
var r:Number=Math.atan2(dy,dx)+Math.PI/2;
//trace(r*180/Math.PI);
//var r:Number=45/180*Math.PI;
matr.createGradientBox(reflectWidth, reflectHeight,r, 0, 0);
gradient.graphics.clear();
gradient.graphics.beginGradientFill(fillType,colors,[getNextAlpha()/100,0],[0,getNextRatio()],matr,spreadMethod);
gradient.graphics.drawRect(0,0,reflectWidth,reflectHeight);
}
public function get reflectWidth():Number{
return distort.image.width+extend*3;
}
public function get reflectHeight():Number{
return distort.image.height*3;
}
public function resetBitmap():void{
resetGradient();
bitmapData.dispose();
bitmapData=new BitmapData(reflectWidth+extend,reflectHeight,true,0xffffff);
bitmapData.draw(distort.image);
bitmap.bitmapData=bitmapData;
}
public function get ph():Number{
return photo.photoHeight;
}
public function get pw():Number{
return photo.photoWidth;
}
public function get photo():Photo{
return Photo(item);
}
override public function get points():Points{
if(_points==null){
_points=new Points();
}
return _points;
}
public function get vpers():Number{
return photo.vpers;
}
public function get hpers():Number{
return photo.hpers;
}
public function getNextAlpha():Number{
var a:Number=currAlpha+((talpha-currAlpha)*speed);
currAlpha=a;
return a;
}
private function getNextRatio():Number{
var r:Number=ratio+((tratio-ratio)*speed);
ratio=r;
return r;
}
public function get extend():Number{
return photo.sys.reflectionExtend;
}
public function get notSelectedAlpha():Number{
return photo.sys.reflectionAlpha;
}
public function get selectedAlpha():Number{
return photo.sys.selectedReflectionAlpha;
}
public function get selectedRatio():Number{
return photo.sys.selectedReflectionDepth;
}
public function get notSelectedRatio():Number{
return photo.sys.reflectionDepth;
}
public function get view():Number{
return photo.sys.view/100;
}
override public function get speed():Number{
return photo.speed;
}
}
}