效果演示:
http://files.cnblogs.com/zhoujunfeng2011/AS3%E4%B8%8A%E4%BC%A0%E5%A4%B4%E5%83%8F.swf
源码:
主文件:Main.as
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.events.Event;
import flash.display.Bitmap;
import flash.utils.setInterval;
import flash.utils.clearInterval;
import flash.utils.setTimeout;
import flash.display.BlendMode;
import flash.geom.Rectangle;
import flash.utils.getQualifiedClassName;
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.utils.ByteArray;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLLoaderDataFormat;
import flash.net.URLLoader;
import flash.net.URLVariables;
import flash.events.IOErrorEvent;
import flash.text.TextField;
import com.net.NativeContentLoader;
import com.ui.interfaces.Interface;
import com.ui.TextStuta.CurrentInfo;
import com.tools.ImageSize;
import com.tools.CutImage;
import com.EditBounds;
import com.images.PNGEncoder;
import com.images.Base64;
import com.greensock.TweenLite;
import com.greensock.easing.*;
public class Main extends Sprite
{
private var init:Interface;
private var fileType:FileFilter;
private var file:FileReference;
private var nativeLoader:NativeContentLoader;
public static var bitmap:Bitmap;
private var IntervalID:uint;
private var Image:Sprite;
private var bounds:EditBounds;
private var obj:Sprite;
private var ImageOriginalWidth:Number = 0;
private var ImageOriginalHeight:Number = 0;
private var cutStatu:int = 1;
private var alphaMask:Sprite;
private var ImageSizes:Array;
private var objectSize:Array = new Array();
private var ImageArray:Array = new Array();
private var url:String = "UploadHandler.ashx";
public function Main():void
{
this.stage.align = StageAlign.TOP_LEFT;
this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.init = new Interface();
this.addChild(this.init);
this.fileType = new FileFilter("图片文件(*.jpg;*.jpge;*.png)","*.jpg;*.jpge;*.png");
this.ImageSizes = new Array([50,50],[100,100],[140,140]);
CheckCamera();
}
private function CheckCamera():void
{
this.Image = new Sprite();
this.init.uploadphotos.addEventListener(MouseEvent.CLICK,uploadphotos_click);
}
private function uploadphotos_click(evt:MouseEvent):void
{
this.init.uploadphotos.removeEventListener(MouseEvent.CLICK,uploadphotos_click);
this.file = new FileReference();
this.file.addEventListener(Event.COMPLETE,CompleteHalder);
this.file.addEventListener(Event.CANCEL,CancelHalder);
this.file.addEventListener(Event.SELECT,SelectHalder);
this.file.browse([this.fileType]);
CurrentInfo.textInfo.text = "温馨提示:只能选择jpge、jpg、png格式图片,暂不支持其他格式";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
}
private function SelectHalder(evt:Event):void
{
this.file.removeEventListener(Event.CANCEL,CancelHalder);
this.file.removeEventListener(Event.SELECT,SelectHalder);
CurrentInfo.textInfo.text = "正在加载图片,请稍后...";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
this.file.load();
}
private function CancelHalder(evt:Event):void
{
this.init.uploadphotos.addEventListener(MouseEvent.CLICK,uploadphotos_click);
this.file.removeEventListener(Event.CANCEL,CancelHalder);
this.file.removeEventListener(Event.SELECT,SelectHalder);
CurrentInfo.textInfo.text = "已取消选择";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
}
private function CompleteHalder(evt:Event):void
{
this.file.removeEventListener(Event.COMPLETE,CompleteHalder);
CurrentInfo.textInfo.text = "加载完成,请稍等...";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
this.nativeLoader = new NativeContentLoader();
this.nativeLoader.load(this.file.data);
this.IntervalID = setInterval(checkImageIsNull,1000);
}
private function checkImageIsNull():void
{
if (bitmap != null)
{
clearInterval(this.IntervalID);
InitEditBounds();
}
}
private function InitEditBounds():void
{
this.init.removeBigBtn();
this.init.UIInit();
this.init.grayPlaid.addChild(this.Image);
this.ImageOriginalWidth = bitmap.width;
this.ImageOriginalHeight = bitmap.height;
this.Image.addChild(bitmap);
bitmap.smoothing = true;
bitmap.x = (-bitmap.width)/2;
bitmap.y = (-bitmap.height)/2;
this.Image.x = 198;
this.Image.y = 158;
alphaMask = new Sprite();
alphaMask.graphics.beginFill(0x000000,0.5);
alphaMask.graphics.drawRect(2.3,43,396,230);
alphaMask.graphics.endFill();
this.addChild(alphaMask);
this.obj = new Sprite();
this.obj.graphics.beginFill(0xFFFFFF);
this.obj.graphics.drawRect(0,0,140,140);
this.obj.graphics.endFill();
this.obj.x = 130.3;
this.obj.y = 88;
alphaMask.blendMode = BlendMode.LAYER;
alphaMask.addChild(this.obj);
this.obj.blendMode = BlendMode.ERASE;
this.bounds = new EditBounds();
this.bounds.target = this.obj;
this.addChild(this.bounds);
this.bounds.maxWidth = 230;
this.bounds.maxHeight = 230;
this.bounds.minWidth = 50;
this.bounds.minHeight = 50;
if(this.Image.width < 60 || this.Image.height < 60)
{
setBoundsSize();
}
CalculateBounds();
AddEventListener();
CurrentInfo.textInfo.text = "提示:点击“确定”按钮进行裁剪、点击“恢复”按钮恢复初始化状态";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
setTimeout(function ():void
{
CurrentInfo.textInfo.text = "请选择图片合适位置进行裁剪头像(140*140)";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
},800);
}
private function AddEventListener():void
{
this.init.leftSpinVessel.buttonMode = true;
this.init.leftSpinVessel.addEventListener(MouseEvent.CLICK,FunctionHalder);
this.init.leftSpinVessel.addEventListener(MouseEvent.MOUSE_OVER,FunctionHalder);
this.init.leftSpinVessel.addEventListener(MouseEvent.MOUSE_OUT,FunctionHalder);
this.init.rightSpinVessel.buttonMode = true;
this.init.rightSpinVessel.addEventListener(MouseEvent.CLICK,FunctionHalder);
this.init.rightSpinVessel.addEventListener(MouseEvent.MOUSE_OVER,FunctionHalder);
this.init.rightSpinVessel.addEventListener(MouseEvent.MOUSE_OUT,FunctionHalder);
this.init.zoomVessel.buttonMode = true;
this.init.zoomVessel.addEventListener(MouseEvent.CLICK,FunctionHalder);
this.init.zoomVessel.addEventListener(MouseEvent.MOUSE_OVER,FunctionHalder);
this.init.zoomVessel.addEventListener(MouseEvent.MOUSE_OUT,FunctionHalder);
this.init.narrowVessel.buttonMode = true;
this.init.narrowVessel.addEventListener(MouseEvent.CLICK,FunctionHalder);
this.init.narrowVessel.addEventListener(MouseEvent.MOUSE_OVER,FunctionHalder);
this.init.narrowVessel.addEventListener(MouseEvent.MOUSE_OUT,FunctionHalder);
this.init.clearsVessel.buttonMode = true;
this.init.clearsVessel.addEventListener(MouseEvent.CLICK,FunctionHalder);
this.init.clearsVessel.addEventListener(MouseEvent.MOUSE_OVER,FunctionHalder);
this.init.clearsVessel.addEventListener(MouseEvent.MOUSE_OUT,FunctionHalder);
this.init.okVessel.buttonMode = true;
this.init.okVessel.addEventListener(MouseEvent.CLICK,FunctionHalder);
this.init.okVessel.addEventListener(MouseEvent.MOUSE_OVER,FunctionHalder);
this.init.okVessel.addEventListener(MouseEvent.MOUSE_OUT,FunctionHalder);
this.init.backsVessel.buttonMode = true;
this.init.backsVessel.addEventListener(MouseEvent.CLICK,FunctionHalder);
this.init.backsVessel.addEventListener(MouseEvent.MOUSE_OVER,FunctionHalder);
this.init.backsVessel.addEventListener(MouseEvent.MOUSE_OUT,FunctionHalder);
}
private function FunctionHalder(evt:MouseEvent):void
{
if (evt.type == "mouseOver")
{
TweenLite.to(evt.currentTarget.getChildAt(0),0.5,{alpha:1,ease:Back.easeOut});
}
else if (evt.type == "mouseOut")
{
TweenLite.to(evt.currentTarget.getChildAt(0),1.5,{alpha:0,ease:Back.easeOut});
}
else if (evt.type == "click")
{
switch (getQualifiedClassName(evt.target))
{
case "leftSpin" :
{
this.leftRotationFunc();
setBoundsSize();
CalculateBounds();
};
break;
case "rightSpin" :
{
this.rightRotationFunc();
setBoundsSize();
CalculateBounds();
};
break;
case "zoom" :
{
this.zoomInFunc();
CalculateBounds();
};
break;
case "narrow" :
{
this.zoomOutFunc();
CalculateBounds();
if (this.cutStatu == 1)
{
this.obj.width = this.obj.height = 50;
this.obj.x = 175.3;
this.obj.y = 133;
}
this.bounds.target = this.obj;
};
break;
case "clears" :
{
if (this.cutStatu == 1)
{
if (this.init.PreviewImage1.numChildren != 0)
{
this.init.PreviewImage1.removeChildAt(0);
}
if (this.init.PreviewImage2.numChildren != 0)
{
this.init.PreviewImage2.removeChildAt(0);
}
if (this.init.PreviewImage3.numChildren != 0)
{
this.init.PreviewImage3.removeChildAt(0);
}
this.Image.rotation = 0;
ImageSize.setImageSize(this.Image,396,230,this.Image.width,this.Image.height);
this.Image.x = 198;
this.Image.y = 158;
this.obj.width = this.obj.height = 140;
this.obj.x = 130.3;
this.obj.y = 88;
this.bounds.target = this.obj;
CalculateBounds();
this.cutStatu = 1;
CurrentInfo.textInfo.text = "请选择图片合适位置进行裁剪";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
}
};
break;
case "ok" :
{
if (this.cutStatu <= 2)
{
var cutbitmapdata:BitmapData = CutImage.cutOutSuper(this.Image,this.obj);
if (this.cutStatu == 1)
{
this.objectSize[0] = ([this.obj.width,this.obj.height]);
this.objectSize[1] = ([this.obj.width,this.obj.height]);
this.objectSize[2] = ([this.obj.width,this.obj.height]);
var bitmap:Bitmap = new Bitmap(cutbitmapdata);
bitmap.smoothing = true;
bitmap.width = bitmap.height = 100;
this.init.PreviewImage2.addChild(bitmap);
bitmap.x = bitmap.y = 1;
var bitmap2:Bitmap = new Bitmap(cutbitmapdata);
bitmap2.smoothing = true;
bitmap2.width = bitmap2.height = 50;
this.init.PreviewImage1.addChild(bitmap2);
bitmap2.x = bitmap2.y = 1;
this.ImageArray.push(bitmap2);
this.ImageArray.push(bitmap);
var bitmap3:Bitmap = new Bitmap(cutbitmapdata);
bitmap3.smoothing = true;
bitmap3.width = bitmap3.height = 140;
this.init.PreviewImage3.addChild(bitmap3);
bitmap3.x = bitmap3.y = 1;
this.ImageArray.push(bitmap3);
this.init.CreatePreviewImage();
this.init.grayPlaid.removeChild(this.Image);
this.removeChild(this.bounds);
this.bounds = null;
this.removeChild(this.alphaMask);
this.init.deleteGrayPlaid();
this.init.addGrayDisplay();
CurrentInfo.textInfo.text = "形象照裁剪成功!系统为您生成三种尺寸(140*140、100*100、50*50)";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
setTimeout(function ():void
{
CurrentInfo.textInfo.text = "提示:点击确定按钮进行保存,不满意点击返回按钮重新编辑";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
},500);
}
else if (this.cutStatu == 2)
{
this.init.addOtherGrayDisplay();
saveImage();
}
this.cutStatu++;
}
};
break;
case "backs" :
{
if (this.cutStatu == 1)
{
deleteUIButton();
this.init.grayPlaid.removeChild(this.Image);
this.Image = null;
this.init.deleteGrayPlaid();
while (this.numChildren > 1)
{
this.removeChildAt(1);
}
this.init.addChildSeleteImage();
this.CheckCamera();
}
else if (this.cutStatu == 2)
{
this.deleteArrayAllElement(this.ImageArray);
this.init.deletePreviewImage();
this.init.addGrayPlaid();
this.init.grayPlaid.addChild(this.Image);
this.addChild(this.alphaMask);
this.Image.rotation = 0;
ImageSize.setImageSize(this.Image,396,230,this.Image.width,this.Image.height);
this.Image.x = 198;
this.Image.y = 158;
this.obj.width = this.obj.height = 140;
this.obj.x = 130.3;
this.obj.y = 88;
this.bounds = new EditBounds();
this.bounds.target = this.obj;
this.addChild(this.bounds);
this.bounds.maxWidth = 230;
this.bounds.maxHeight = 230;
this.bounds.minWidth = 50;
this.bounds.minHeight = 50;
CalculateBounds();
this.init.removeGrayDisplay();
this.cutStatu = 1;
CurrentInfo.textInfo.text = "请选择图片合适位置进行裁剪(140*140)";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
}
};
break;
}
}
}
private function deleteUIButton():void
{
while (this.init.count.numChildren >0)
{
if (getQualifiedClassName(this.init.count.getChildAt(0)) == "flash.display::Sprite")
{
if (this.init.count.getChildAt(0).hasEventListener(MouseEvent.CLICK))
{
this.init.count.getChildAt(0).removeEventListener(MouseEvent.CLICK,FunctionHalder);
this.init.count.getChildAt(0).removeEventListener(MouseEvent.MOUSE_OVER,FunctionHalder);
this.init.count.getChildAt(0).removeEventListener(MouseEvent.MOUSE_OUT,FunctionHalder);
}
}
var Nulls:* = this.init.count.getChildAt(0);
this.init.count.removeChildAt(0);
Nulls = null;
}
}
private function CalculateBounds():void
{
var numx:Number = this.Image.x - this.Image.width / 2;
var numy:Number = this.Image.y - this.Image.height / 2;
var numw:Number = this.Image.width + numx;
var numh:Number = this.Image.height + numy;
if (numx <= 2.3)
{
numx = 2.3;
numw = 398.3;
}
if (numy <= 43)
{
numy = 43;
numh = 273;
}
this.bounds.selectBounds = new Rectangle(numx,numy,numw,numh);
}
private function zoomInFunc(num:Number = 1.1)
{
if (this.Image.width < this.ImageOriginalWidth && this.Image.height < this.ImageOriginalHeight)
{
var scaleNum:Number = this.Image.scaleY * num;
this.Image.scaleY = this.Image.scaleY * num;
this.Image.scaleX = scaleNum;
}
}
private function zoomOutFunc(num:Number = 0.9)
{
if (this.Image.width > 54 && this.Image.height > 54)
{
var num1:Number = this.Image.scaleY * num;
this.Image.scaleY *= num;
this.Image.scaleX = num1;
if(this.Image.width > this.Image.height)
{
this.bounds.maxWidth = this.bounds.maxHeight = this.Image.height;
}
else
{
this.bounds.maxWidth = this.bounds.maxHeight = this.Image.width;
}
}
}
private function leftRotationFunc(num = 90)
{
this.Image.rotation -= num;
}
private function rightRotationFunc(num = 90)
{
this.Image.rotation += num;
}
private function setBoundsSize():void
{
if(this.Image.width != this.Image.height)
{
this.obj.width = this.obj.height = 50;
this.obj.x = 175.3;
this.obj.y = 133;
this.bounds.target = this.obj;
}
}
//删除数组中所有元素方法
private function deleteArrayAllElement(array:Array):void
{
while(array.length != 0)
{
array.splice(0,array.length);
/*if(array.length == 0)
{
trace("删除完成");
}*/
}
}
private function saveImage():void
{
if (this.ImageArray != null)
{
var mydata:URLVariables = new URLVariables();
for(var i:int = 0;i<this.ImageArray.length;i++)
{
var numw:Number = this.ImageSizes[i][0] / this.objectSize[i][0];
var numh:Number = this.ImageSizes[i][1] / this.objectSize[i][1];
var bitmapdata:BitmapData = new BitmapData(this.ImageSizes[i][0],this.ImageSizes[i][1],true,0x00);
bitmapdata.draw(this.ImageArray[i],new Matrix(numw,0,0,numh));
var _data:ByteArray = PNGEncoder.encode(bitmapdata);
var pngString:String = Base64.encodeByteArray(_data);
if(i == 0)
{
mydata.small = pngString;
}
else if(i == 1)
{
mydata.medium = pngString;
}
else if(i == 2)
{
mydata.big = pngString;
}
bitmapdata.dispose();
bitmapdata = null;
}
var _request:URLRequest = new URLRequest(this.url);
//_request.contentType = "application/octet-stream";
_request.data = mydata;
_request.method = URLRequestMethod.POST;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
try
{
loader.load(_request);
loader.addEventListener(IOErrorEvent.IO_ERROR,UpLoadFailedHalder);
loader.addEventListener(Event.COMPLETE,UpLoadCompleteHalder);
}
catch (error:ArgumentError)
{
CurrentInfo.textInfo.text = "Error:参数错误!请联系管理员!";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
}
catch (error:SecurityError)
{
CurrentInfo.textInfo.text = "Error:安全性错误!请联系管理员!";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
}
}
}
private function UpLoadFailedHalder(evt:IOErrorEvent):void
{
evt.target.removeEventListener(IOErrorEvent.IO_ERROR,UpLoadFailedHalder);
CurrentInfo.textInfo.text = "图片上传失败,请检查网络!";
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
}
private function UpLoadCompleteHalder(evt:Event):void
{
evt.target.removeEventListener(Event.COMPLETE,UpLoadCompleteHalder);
evt.target.close();
CurrentInfo.textInfo.text = (evt.target as URLLoader).data;
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
}
}
}
其他类:
package com.net
{
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.system.LoaderContext;
import flash.system.SecurityDomain;
import flash.system.ApplicationDomain;
import flash.utils.ByteArray;
import Main;
/**
* 装载加载进来的图片
* @author xiaofeng
*/
public class NativeContentLoader extends Sprite
{
private var loaderContext:LoaderContext;
private var loader:Loader;
private var URLloader:URLLoader;
public function NativeContentLoader()
{
this.loaderContext = new LoaderContext(true);
this.loader = new Loader();
this.URLloader = new URLLoader();
this.loaderContext.securityDomain = SecurityDomain.currentDomain;
this.loaderContext.applicationDomain = ApplicationDomain.currentDomain;
this.loader.contentLoaderInfo.addEventListener(Event.COMPLETE, Loader_Complete);
this.loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, Loader_IOERROR);
this.URLloader.addEventListener(Event.COMPLETE, URLloader_Compelte);
this.URLloader.dataFormat = URLLoaderDataFormat.BINARY;
}
private function Loader_Complete(evt:Event):void
{
try
{
Main.bitmap = evt.target.content;
}
catch (e:SecurityError)
{
this.dispatchEvent(new Event("SecurityError"));
}
}
private function Loader_IOERROR(evt:IOErrorEvent):void
{
//忽略错误
evt.target.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, Loader_IOERROR);
}
private function URLloader_Compelte(evt:Event):void
{
var byteArray:ByteArray;
try
{
byteArray = new ByteArray();
byteArray.writeBytes(evt.target.data);
byteArray.position = 0;
this.loader.loadBytes(byteArray);
}
catch (e:SecurityError)
{
this.dispatchEvent(new Event("SecurityError"));
}
evt.target.removeEventListener(Event.COMPLETE, URLloader_Compelte);
}
public function load(byteArray:ByteArray):void
{
this.unload();
this.loader.loadBytes(byteArray);
}
private function unload():void
{
this.loader.unload();
}
}
}
package com.tools
{
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.display.Sprite;
/**
* 裁剪图片类
* @author 转载(稍作修改)
*/
public class CutImage
{
public function CutImage()
{
}
/**
* 裁剪指定矩形区域并返回一个包含结果的 BitmapData 对象。
*
* @param target 需要裁剪的显示对象。
*
* @param width 位图图像的宽度,以像素为单位。
*
* @param height 位图图像的高度,以像素为单位。
*
* @param distanceX 切割矩形左上角的点到显示对象矩形左上角的点的水平距离。注意:左上角的点不一定就是注册点(0, 0)外,变形过的显示对象就是一个例外。
*
* @param distanceY 切割矩形左上角的点到显示对象矩形左上角的点的垂直距离。注意:左上角的点不一定就是注册点(0, 0)外,变形过的显示对象就是一个例外。
*
* @param transparent 指定裁剪后的位图图像是否支持每个像素具有不同的透明度。默认值为 true(透明)。若要创建完全透明的位图,请将 transparent 参数的值设置为 true,将 fillColor 参数的值设置为 0x00000000(或设置为 0)。将 transparent 属性设置为 false 可以略微提升呈现性能。
*
* @param fillColor 用于填充裁剪后的位图图像区域背景的 32 位 ARGB 颜色值。默认值为 0x00000000(纯透明黑色)。
*
* @returns 返回裁剪后的 BitmapData 对象。
*/
public static function cutOutRect( target:DisplayObject, distanceX:Number, distanceY:Number, width:Number, height:Number, transparent:Boolean = true, fillColor:uint = 0x00000000 ):BitmapData
{
var m:Matrix = target.transform.matrix;
m.tx -= target.getBounds( target.parent ).x + distanceX;
m.ty -= target.getBounds( target.parent ).y + distanceY;
var bmpData:BitmapData = new BitmapData( width, height, transparent, fillColor );
bmpData.draw( target, m);
return bmpData;
}
/**
* 超级裁剪工具!可裁剪任意形状!给定一个裁剪目标和一个模板,就可根据模板裁剪出形状相配的 BitmapData 数据。
*
* @param target 需要裁剪的显示对象。
*
* @param template 裁剪模板,可以是任意形状。
*
* @returns 返回裁剪后的 BitmapData 对象。
*/
public static function cutOutSuper( target:DisplayObject, template:DisplayObject):BitmapData
{
var rectTarget:Rectangle = target.transform.pixelBounds;
var rectTemplate:Rectangle = template.transform.pixelBounds;
var targetBitmapData:BitmapData = CutImage.cutOutRect( target, 0, 0, rectTarget.width, rectTarget.height, true, 0x00000000 );
var templateBitmapData:BitmapData = CutImage.cutOutRect( target, 0, 0, rectTemplate.width, rectTemplate.height, true, 0x00000000 );
for( var pixelY:int = 0; pixelY < rectTemplate.height; pixelY++ )
{
for( var pixelX:int = 0; pixelX < rectTemplate.width; pixelX++ )
{
if( templateBitmapData.getPixel( pixelX, pixelY ) != 0 )
{
var color:uint = targetBitmapData.getPixel32( pixelX + rectTemplate.x - rectTarget.x, pixelY + rectTemplate.y - rectTarget.y );
templateBitmapData.setPixel32( pixelX, pixelY, color );
}
}
}
return templateBitmapData;
}
}
}
package com.tools
{
import flash.display.Sprite;
import flash.display.Shape;
/**
*绘制格式图形类
*@Author:xiaofeng
*/
public class Draws
{
public function Draws():void
{
}
/**
*绘制黑白格方法,X、Y:返回的Sprite对象的x轴和y轴坐标,Width、Height:返回的Sprite的总宽度以及高度,PixelSize:绘制格子的大小,以像素为单位
*/
public static function DrawLattice(X:Number = 0,Y:Number = 0,Width:int = 100,Height:int = 100,PixelSize:int = 5):Sprite
{
//管理小格子对象
var LatticeCount:Sprite = new Sprite();
//计算外层需要循环的次数
var num:int = Height / PixelSize;
//计算内层需要循环的次数
var num2:int = Width / PixelSize;
//保存颜色值,初始为白色
var colors:uint = 0xFFFFFF;
for (var i:int = 0; i<num; i++)
{
for (var j:int = 0; j<num2; j++)
{
var SmallLattice:Shape = new Shape();
//判断颜色是黑还是白
if(i % 2)
{
if(j % 2)
{
colors = 0xC0C0C0;
}
else
{
colors = 0xFFFFFF;
}
}
else
{
if( j % 2)
{
colors = 0xFFFFFF;
}
else
{
colors = 0xC0C0C0;
}
}
SmallLattice.graphics.beginFill(colors);
SmallLattice.graphics.drawRect(X,Y,PixelSize,PixelSize);
SmallLattice.graphics.endFill();
LatticeCount.addChild(SmallLattice);
SmallLattice.x = j * PixelSize;
SmallLattice.y = i * PixelSize;
}
}
return LatticeCount;
}
/**
* 绘制矩形线框方法
*/
public static function DrawRects(w:Number, h:Number):Sprite
{
var rect:Sprite = new Sprite();
rect.graphics.beginFill(0xFFFFFF);
rect.graphics.lineStyle(1, 0x000000);
rect.graphics.drawRect(0, 0, w, h);
rect.graphics.endFill();
return rect;
}
}
}
package com.tools
{
import flash.display.Sprite;
/**
* 设置图片大小类
* @author xiaofeng
*/
public class ImageSize
{
public function ImageSize()
{
}
/**
* 参数说明
* @param Image:需要设置大小的显示对象
* @param FrameWidth:框架宽度
* @param FrameHeight:框架高度
* @param ImageWidth:图片加载进来时宽度
* @param ImageHeight:图片加载进来时高度
*/
public static function setImageSize(Image:*,FrameWidth:Number,FrameHeight:Number,ImageWidth:Number, ImageHeight:Number):void
{
if ((ImageWidth / ImageHeight) > (FrameWidth / FrameHeight))
{
Image.width = FrameWidth;
Image.height = FrameWidth / (ImageWidth / ImageHeight);
}
else if ((ImageWidth / ImageHeight) < (FrameWidth / FrameHeight))
{
Image.height = FrameHeight;
Image.width = FrameHeight * (ImageWidth / ImageHeight);
}
else if ((ImageWidth / ImageHeight) == (FrameWidth / FrameHeight))
{
Image.width = FrameWidth;
Image.height = FrameHeight;
}
}
}
}
package com.tools
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Shape;
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.display.Graphics;
import flash.geom.Point;
import flash.display.GradientType;
/**
* 反射倒影生成类...
*/
public class Reflection extends Sprite
{
private var _reflection:Bitmap;
private var _bit:BitmapData;
private var _mtx:Matrix;
private var _rBox:Shape;
private var _Alpha:BitmapData;
public function Reflection($Target:DisplayObject,$Height:Number=200,$Alpha:Number=1,AddHeight:Number =0):void
{
_reflection = new Bitmap(getReflection($Target,$Height));//
_reflection.smoothing = true;//平滑
_reflection.alpha = $Alpha;
addChild(_reflection);
this.x = $Target.x;
this.y = $Target.y + $Target.height + AddHeight;
}
private function getReflection(target:DisplayObject, Height:Number = -1):BitmapData
{
if (Height < 0)
{
Height = target.height;
}
_bit = new BitmapData(target.width,Height,true,0);
_bit.draw(target, new Matrix(1, 0, 0, -1, 0, target.height));
_mtx = new Matrix();
_mtx.createGradientBox(target.width, Height, 0.5 * Math.PI);
_rBox = new Shape();
_rBox.graphics.beginGradientFill(GradientType.LINEAR, [0, 0], [0.5, 0], [0, 255], _mtx);
_rBox.graphics.drawRect(0, 0, target.width, Height);
_rBox.graphics.endFill();
_Alpha = new BitmapData(target.width,Height,true,0);
_Alpha.draw(_rBox);
_bit.copyPixels(_bit, _bit.rect, new Point(0, 0), _Alpha, new Point(0, 0), false);
return _bit.clone();
}
}
}
ui包中的类:
package com.ui.interfaces
{
import flash.display.Sprite;
import com.ui.*;
import com.tools.Reflection;
import com.tools.Draws;
import com.ui.TextStuta.CurrentInfo;
import flash.display.Bitmap;
import flash.text.TextFormatAlign;
import flash.display.Shape;
public class Interface extends Sprite
{
public var count:Sprite = new Sprite();
public var uploadphotos:UpLoadPhotos;
public var uploadphotos_ref:Reflection;
public var leftSpinVessel:Sprite;
private var leftSpinBtn:leftSpin;
private var leftSpinGray:leftSpin_gray;
public var rightSpinVessel:Sprite;
private var rightSpinBtn:rightSpin;
private var rightSpinGray:rightSpin_gray;
public var zoomVessel:Sprite;
private var zoomBtn:zoom;
private var zoomGray:zoom_gray;
public var narrowVessel:Sprite;
private var narrowBtn:narrow;
private var narrowGray:narrow_gray;
public var clearsVessel:Sprite;
private var clearsBtn:clears;
private var clearsGray:clears_gray;
public var okVessel:Sprite;
private var okBtn:ok;
private var okGray:ok_gray;
public var backsVessel:Sprite;
private var backsBtn:backs;
private var backsGray:backs_gray;
public var PreviewImage1:Sprite;//50*50
public var PreviewImage2:Sprite;//100*100
public var PreviewImage3:Sprite;//140*140
private var PreviewImage1_ref:Reflection;
private var PreviewImage2_ref:Reflection;
private var PreviewImage3_ref:Reflection;
public var grayPlaid:Sprite;
private var Int:int = 1;
public function Interface():void
{
var backGround:Bitmap = new Bitmap(new BG());
this.addChild(backGround);
var logo:Bitmap = new Bitmap(new Logo());
this.addChild(logo);
logo.x = 6;
logo.y = 2;
this.uploadphotos = new UpLoadPhotos();
this.addChild(this.uploadphotos);
this.uploadphotos.buttonMode = true;
this.uploadphotos.x = (400 - this.uploadphotos.width)/2;
this.uploadphotos.y = (300 - this.uploadphotos.height)/2;
this.uploadphotos_ref = new Reflection(this.uploadphotos,30,0.7);
this.addChild(this.uploadphotos_ref);
CurrentInfo.textInfoFormat.size = 12;
CurrentInfo.textInfoFormat.color = 0x999999;
CurrentInfo.textInfoFormat.font = "仿宋";
CurrentInfo.textInfoFormat.align = TextFormatAlign.LEFT;
CurrentInfo.textInfo.text = "温馨提示:上传的图片尽量大于140*140像素";
CurrentInfo.textInfo.selectable = false;
CurrentInfo.textInfo.mouseEnabled = false;
CurrentInfo.textInfo.width = 400;
CurrentInfo.textInfo.setTextFormat(CurrentInfo.textInfoFormat);
this.addChild(CurrentInfo.textInfo);
CurrentInfo.textInfo.x = 4;
CurrentInfo.textInfo.y = 276;
this.PreviewImage1 = Draws.DrawRects(51,51);
this.PreviewImage2 = Draws.DrawRects(101,101);
this.PreviewImage3 = Draws.DrawRects(141,141);
}
public function addChildSeleteImage():void
{
this.addChild(this.uploadphotos);
this.addChild(this.uploadphotos_ref);
}
public function removeBigBtn():void
{
if(this.uploadphotos.parent != null)
{
this.removeChild(this.uploadphotos);
this.removeChild(this.uploadphotos_ref);
}
}
public function UIInit():void
{
this.addChild(this.count);
grayPlaid = Draws.DrawLattice(2.3,43,396,230);
this.addChild(grayPlaid);
var Mask:Shape = new Shape();
Mask.graphics.beginFill(0x000000);
Mask.graphics.drawRect(2.3,43,396,230);
Mask.graphics.endFill();
this.addChild(Mask);
grayPlaid.mask = Mask;
this.leftSpinVessel = new Sprite();
this.count.addChild(this.leftSpinVessel);
this.leftSpinVessel.x = 40;
this.leftSpinVessel.y = 2;
var leftAlphaBG:alphaBG = new alphaBG();
this.leftSpinVessel.addChild(leftAlphaBG);
leftAlphaBG.alpha = 0;
leftSpinBtn = new leftSpin();
this.leftSpinVessel.addChild(leftSpinBtn);
leftSpinBtn.x = (leftAlphaBG.width - leftSpinBtn.width)/2;
leftSpinBtn.y = (leftAlphaBG.height - leftSpinBtn.height)/2;
var line1:line = new line();
this.count.addChild(line1);
line1.x = this.leftSpinVessel.x + this.leftSpinVessel.width + 3;
this.rightSpinVessel = new Sprite();
this.count.addChild(this.rightSpinVessel);
this.rightSpinVessel.x = line1.x + 4;
this.rightSpinVessel.y = this.leftSpinVessel.y;
var rightAlphaBG:alphaBG = new alphaBG();
this.rightSpinVessel.addChild(rightAlphaBG);
rightAlphaBG.alpha = 0;
rightSpinBtn = new rightSpin();
this.rightSpinVessel.addChild(rightSpinBtn);
rightSpinBtn.x = (rightAlphaBG.width - rightSpinBtn.width)/2;
rightSpinBtn.y = (rightAlphaBG.height - rightSpinBtn.height)/2;
var line2:line = new line();
this.count.addChild(line2);
line2.x = this.rightSpinVessel.x + this.rightSpinVessel.width + 3;
this.zoomVessel = new Sprite();
this.count.addChild(this.zoomVessel);
this.zoomVessel.x = line2.x + 4;
this.zoomVessel.y = this.leftSpinVessel.y;
var zoomAlphaBG:alphaBG = new alphaBG();
this.zoomVessel.addChild(zoomAlphaBG);
zoomAlphaBG.alpha = 0;
zoomBtn = new zoom();
this.zoomVessel.addChild(zoomBtn);
zoomBtn.x = (zoomAlphaBG.width - zoomBtn.width)/2;
zoomBtn.y = (zoomAlphaBG.height - zoomBtn.height)/2;
var line3:line = new line();
this.count.addChild(line3);
line3.x = this.zoomVessel.x + this.zoomVessel.width + 3;
this.narrowVessel = new Sprite();
this.count.addChild(this.narrowVessel);
this.narrowVessel.x = line3.x + 4;
this.narrowVessel.y = this.zoomVessel.y;
var narrowAlphaBG:alphaBG = new alphaBG();
this.narrowVessel.addChild(narrowAlphaBG);
narrowAlphaBG.alpha = 0;
narrowBtn = new narrow();
this.narrowVessel.addChild(narrowBtn);
narrowBtn.x = (narrowAlphaBG.width - narrowBtn.width)/2;
narrowBtn.y = (narrowAlphaBG.height - narrowBtn.height)/2;
var line4:line = new line();
this.count.addChild(line4);
line4.x = this.narrowVessel.x + this.narrowVessel.width + 3;
this.clearsVessel = new Sprite();
this.count.addChild(this.clearsVessel);
this.clearsVessel.x = line4.x + 4;
this.clearsVessel.y = this.narrowVessel.y;
var clearsAlphaBG:alphaBG = new alphaBG();
this.clearsVessel.addChild(clearsAlphaBG);
clearsAlphaBG.alpha = 0;
clearsBtn = new clears();
this.clearsVessel.addChild(clearsBtn);
clearsBtn.x = clearsAlphaBG.width/2;
clearsBtn.y = clearsAlphaBG.height/2;
var line5:line = new line();
this.count.addChild(line5);
line5.x = this.clearsVessel.x + this.clearsVessel.width + 3;
this.okVessel = new Sprite();
this.count.addChild(this.okVessel);
this.okVessel.x = line5.x + 4;
this.okVessel.y = this.clearsVessel.y;
var okAlphaBG:alphaBG = new alphaBG();
this.okVessel.addChild(okAlphaBG);
okAlphaBG.alpha = 0;
okBtn = new ok();
this.okVessel.addChild(okBtn);
okBtn.x = (okAlphaBG.width - okBtn.width)/2;
okBtn.y = (okAlphaBG.height - okBtn.height)/2;
this.backsVessel = new Sprite();
this.count.addChild(this.backsVessel);
this.backsVessel.x = this.okVessel.x + this.okVessel.width + 40;
this.backsVessel.y = this.okVessel.y;
var backsAlphaBG:backAlphaBG = new backAlphaBG();
this.backsVessel.addChild(backsAlphaBG);
backsAlphaBG.alpha = 0;
backsBtn = new backs();
this.backsVessel.addChild(backsBtn);
backsBtn.x = (backsAlphaBG.width - backsBtn.width)/2;
backsBtn.y = (backsAlphaBG.height - backsBtn.height)/2;
}
public function CreatePreviewImage():void
{
this.count.addChild(this.PreviewImage1);
this.count.addChild(this.PreviewImage2);
this.count.addChild(this.PreviewImage3);
this.PreviewImage3.x = 25;
this.PreviewImage3.y = 90;
this.PreviewImage2.x = 195;
this.PreviewImage2.y = 100;
this.PreviewImage1.x = 320;
this.PreviewImage1.y = 110;
PreviewImage1_ref = new Reflection(this.PreviewImage1,30,0.5);
PreviewImage2_ref = new Reflection(this.PreviewImage2,30,0.5);
PreviewImage3_ref = new Reflection(this.PreviewImage3,30,0.5);
this.count.addChild(PreviewImage1_ref);
this.count.addChild(PreviewImage2_ref);
this.count.addChild(PreviewImage3_ref);
}
public function deleteGrayPlaid():void
{
this.removeChild(grayPlaid);
}
public function addGrayPlaid():void
{
this.addChild(grayPlaid);
}
public function deletePreviewImage():void
{
if(this.PreviewImage3.numChildren != 0)
{
this.PreviewImage3.removeChildAt(0);
}
if(this.PreviewImage1.numChildren != 0)
{
this.PreviewImage1.removeChildAt(0);
}
if(this.PreviewImage2.numChildren != 0)
{
this.PreviewImage2.removeChildAt(0);
}
if(this.PreviewImage1.parent != null)
{
this.count.removeChild(this.PreviewImage1);
this.count.removeChild(this.PreviewImage2);
this.count.removeChild(this.PreviewImage3);
}
if(this.PreviewImage1_ref != null && this.PreviewImage1_ref.parent != null)
{
this.count.removeChild(this.PreviewImage1_ref);
this.count.removeChild(this.PreviewImage2_ref);
this.count.removeChild(this.PreviewImage3_ref);
}
}
public function addGrayDisplay():void
{
if(this.Int == 1)
{
this.newGray();
}
this.Int ++;
this.leftSpinVessel.removeChildAt(1);
this.leftSpinVessel.addChildAt(this.leftSpinGray,1);
this.rightSpinVessel.removeChildAt(1);
this.rightSpinVessel.addChildAt(this.rightSpinGray,1);
this.zoomVessel.removeChildAt(1);
this.zoomVessel.addChildAt(this.zoomGray,1);
this.narrowVessel.removeChildAt(1);
this.narrowVessel.addChildAt(this.narrowGray,1);
this.clearsVessel.removeChildAt(1);
this.clearsVessel.addChildAt(this.clearsGray,1);
}
public function removeGrayDisplay():void
{
this.leftSpinVessel.removeChildAt(1);
this.leftSpinVessel.addChildAt(this.leftSpinBtn,1);
this.rightSpinVessel.removeChildAt(1);
this.rightSpinVessel.addChildAt(this.rightSpinBtn,1);
this.zoomVessel.removeChildAt(1);
this.zoomVessel.addChildAt(this.zoomBtn,1);
this.narrowVessel.removeChildAt(1);
this.narrowVessel.addChildAt(this.narrowBtn,1);
this.clearsVessel.removeChildAt(1);
this.clearsVessel.addChildAt(this.clearsBtn,1);
}
public function addOtherGrayDisplay():void
{
this.okVessel.removeChildAt(1);
this.okVessel.addChildAt(this.okGray,1);
this.backsVessel.removeChildAt(1);
this.backsVessel.addChildAt(this.backsGray,1);
}
public function removeOtherGrayDisplay():void
{
this.okVessel.removeChildAt(1);
this.okVessel.addChildAt(this.okBtn,1);
this.backsVessel.removeChildAt(1);
this.backsVessel.addChildAt(this.backsBtn,1);
}
private function newGray():void
{
//实例化至灰按钮
this.leftSpinGray = new leftSpin_gray();
this.leftSpinGray.x = this.leftSpinVessel.getChildAt(1).x;
this.leftSpinGray.y = this.leftSpinVessel.getChildAt(1).y;
this.rightSpinGray = new rightSpin_gray();
this.rightSpinGray.x = this.rightSpinVessel.getChildAt(1).x;
this.rightSpinGray.y = this.rightSpinVessel.getChildAt(1).y;
this.zoomGray = new zoom_gray();
this.zoomGray.x = this.zoomVessel.getChildAt(1).x;
this.zoomGray.y = this.zoomVessel.getChildAt(1).y;
this.narrowGray = new narrow_gray();
this.narrowGray.x = this.narrowVessel.getChildAt(1).x;
this.narrowGray.y = this.narrowVessel.getChildAt(1).y;
this.clearsGray = new clears_gray();
this.clearsGray.x = this.clearsVessel.getChildAt(1).x;
this.clearsGray.y = this.clearsVessel.getChildAt(1).y;
this.okGray = new ok_gray();
this.okGray.x = this.okVessel.getChildAt(1).x;
this.okGray.y = this.okVessel.getChildAt(1).y;
this.backsGray = new backs_gray();
this.backsGray.x = this.backsVessel.getChildAt(1).x;
this.backsGray.y = this.backsVessel.getChildAt(1).y;
}
}
}
package com.ui.TextStuta
{
import flash.text.TextField;
import flash.text.TextFormat;
public class CurrentInfo
{
public static var textInfo:TextField = new TextField();
public static var textInfoFormat:TextFormat = new TextFormat();
}
}
package com.ui
{
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.DisplayObjectContainer;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.ui.Mouse;
public class MouseCursor extends Object
{
public static var MOUSE_MOVING:uint = 3;
public static var MOUSE_RESIZABLE:uint = 1;
public static var MOUSE_MOVABLE:uint = 2;
private static var _status:uint = MOUSE_NORMAL;
public static var MOUSE_NORMAL:uint = 0;
public static var MOUSE_RESIZABLEH:uint = 4;
private static var _resizable:Sprite;
private static var _moving:Sprite;
private static var _movable:Sprite;
private static var _resizableh:Sprite;
public function MouseCursor()
{
return;
}
public static function hide():void
{
show(MOUSE_NORMAL);
return;
}
public static function setPoint(X:Number, Y:Number):void
{
_movable.x = Math.round(X);
_movable.y = Math.round(Y);
_resizable.x = Math.round(X);
_resizable.y = Math.round(Y);
_resizableh.x = Math.round(X);
_resizableh.y = Math.round(Y);
_moving.x = Math.round(X);
_moving.y = Math.round(Y);
return;
}
public static function init(disobjc:DisplayObjectContainer):void
{
var bitmap:Bitmap = null;
if (disobjc.stage == null)
{
disobjc.addEventListener(Event.ADDED_TO_STAGE, addedHandler);
return;
}
if (_resizable == null)
{
_resizable = new Sprite();
bitmap = new Bitmap(new ResizeCursor());
bitmap.x = (-bitmap.width) / 2;
bitmap.y = (-bitmap.height) / 2;
_resizable.addChild(bitmap);
_resizable.visible = false;
_resizable.mouseChildren = false;
_resizable.mouseEnabled = false;
disobjc.stage.addChild(_resizable);
}
if (_resizableh == null)
{
_resizableh = new Sprite();
bitmap = new Bitmap(new ResizeHCursor());
bitmap.x = (-bitmap.width) / 2;
bitmap.y = (-bitmap.height) / 2;
_resizableh.addChild(bitmap);
_resizableh.visible = false;
_resizableh.mouseChildren = false;
_resizableh.mouseEnabled = false;
disobjc.stage.addChild(_resizableh);
}
if (_movable == null)
{
_movable = new Sprite();
bitmap = new Bitmap(new MoveCursor());
bitmap.x = (-bitmap.width) / 2;
bitmap.y = (-bitmap.height) / 2;
_movable.addChild(bitmap);
_movable.visible = false;
_movable.mouseChildren = false;
_movable.mouseEnabled = false;
disobjc.stage.addChild(_movable);
}
if (_moving == null)
{
_moving = new Sprite();
bitmap = new Bitmap(new MoveCursor());
bitmap.x = (-bitmap.width) / 2;
bitmap.y = (-bitmap.height) / 2;
_moving.addChild(bitmap);
_moving.visible = false;
_moving.mouseChildren = false;
_moving.mouseEnabled = false;
disobjc.stage.addChild(_moving);
}
disobjc.stage.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
disobjc.stage.addEventListener(MouseEvent.CLICK, clickHandler);
disobjc.stage.addEventListener(Event.MOUSE_LEAVE, leaveHandler);
return;
}
public static function leaveHandler(event:Event):void
{
_movable.visible = false;
_resizable.visible = false;
_resizableh.visible = false;
_moving.visible = false;
return;
}
private static function addedHandler(event:Event):void
{
event.target.removeEventListener(Event.ADDED_TO_STAGE, addedHandler);
MouseCursor.init(event.target as DisplayObjectContainer);
return;
}
public static function clickHandler(event:MouseEvent):void
{
if (_status != MOUSE_NORMAL)
{
Mouse.hide();
}
setPoint(event.stageX, event.stageY);
return;
}
public static function moveHandler(event:MouseEvent):void
{
setPoint(event.stageX, event.stageY);
_movable.visible = _status == MOUSE_MOVABLE;
_resizable.visible = _status == MOUSE_RESIZABLE;
_resizableh.visible = _status == MOUSE_RESIZABLEH;
_moving.visible = _status == MOUSE_MOVING;
event.updateAfterEvent();
return;
}
public static function show(num1:uint, num2:uint = 0):void
{
if (num1 == MOUSE_RESIZABLE)
{
if (num2 % 90 == 0)
{
num1 = MOUSE_RESIZABLEH;
_resizableh.rotation = num2 + 90;
}
else
{
_resizable.rotation = num2 + 45;
}
}
if (_status == num1)
{
return;
}
_status = num1;
if (num1 == MOUSE_RESIZABLE)
{
Mouse.hide();
_resizableh.visible = false;
_movable.visible = false;
_moving.visible = false;
_resizable.visible = true;
}
else if (num1 == MOUSE_RESIZABLEH)
{
Mouse.hide();
_resizable.visible = false;
_moving.visible = false;
_movable.visible = false;
_resizableh.visible = true;
}
else if (num1 == MOUSE_MOVABLE)
{
Mouse.hide();
_resizable.visible = false;
_resizableh.visible = false;
_moving.visible = false;
_movable.visible = true;
}
else if (num1 == MOUSE_MOVING)
{
Mouse.hide();
_resizable.visible = false;
_resizableh.visible = false;
_movable.visible = false;
_moving.visible = true;
}
else
{
_resizable.visible = false;
_resizableh.visible = false;
_movable.visible = false;
_moving.visible = false;
Mouse.show();
}
return;
}
}
}
package com
{
import com.ui.MouseCursor;
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.display.Stage;
public class EditBounds extends Sprite
{
private var ox:Number;
private var ratio:Number = 1;
private var currDir:String;
public var selectWidth:Number = 100;
private var constraints:Boolean = false;
public var selectHeight:Number = 100;
public var line:Sprite;
private var outRangle:Boolean = false;
private var soy:Number;
private var resizeDir:Object;
private var cornerWidth:Number = 6;
public var minHeight:Number = 4.94066e-324;
public var maxHeight:Number = 1.79769e+308;
public var minWidth:Number = 4.94066e-324;
public var maxWidth:Number = 1.79769e+308;
private var corners:Object;
private var _target:DisplayObject;
private var sox:Number;
private var bounds:Rectangle;
private var mousedown:Boolean = false;
private var oh:Number;
private var rox:Number;
private var roy:Number;
private var ow:Number;
private var oy:Number;
private var cursorRotations:Object;
public static var busy:Boolean = false;
public function EditBounds():void
{
corners = {};
cursorRotations = {lt:135,t:0,rt:45,r:90,rb:135,b:0,lb:45,l:90};
resizeDir = {lt:resize_lt,t:resize_t,rt:resize_rt,r:resize_r,rb:resize_rb,b:resize_b,lb:resize_lb,l:resize_l};
selectWidth = 100;
selectHeight = 100;
cornerWidth = 6;
maxWidth = Number.MAX_VALUE;
maxHeight = Number.MAX_VALUE;
minWidth = Number.MIN_VALUE;
minHeight = Number.MIN_VALUE;
constraints = false;
ratio = 1;
mousedown = false;
bounds = new Rectangle(0,0,100,100);
outRangle = false;
line = new Sprite();
line.x = cornerWidth / 2;
line.y = cornerWidth / 2;
line.graphics.beginFill(0x0000FF);
line.graphics.drawRect(0, 0, (selectWidth - 1), 1);
line.graphics.drawRect((selectWidth - 1), 0, 1, (selectHeight - 1));
line.graphics.drawRect(1, (selectHeight - 1), (selectWidth - 1), 1);
line.graphics.drawRect(0, 1, 1, (selectHeight - 1));
line.graphics.endFill();
line.graphics.beginFill(0, 0);
line.graphics.drawRect(1, 1, selectWidth - 2, selectHeight - 2);
line.graphics.endFill();
line.scale9Grid = new Rectangle(2,2,selectWidth - 4,selectHeight - 4);
corners.lt = createCorner("lt",0,0,cornerWidth);
corners.t = createCorner("t",0,0,cornerWidth);
corners.rt = createCorner("rt",0,0,cornerWidth);
corners.r = createCorner("r",0,0,cornerWidth);
corners.rb = createCorner("rb",0,0,cornerWidth);
corners.b = createCorner("b",0,0,cornerWidth);
corners.lb = createCorner("lb",0,0,cornerWidth);
corners.l = createCorner("l",0,0,cornerWidth);
addChild(line);
addChild(corners.lt);
addChild(corners.rt);
addChild(corners.rb);
addChild(corners.lb);
constraints = true;
addChild(corners.t);
addChild(corners.r);
addChild(corners.b);
addChild(corners.l);
MouseCursor.init(this);
resetCorner();
return;
}
private function resize_lt(W:Number, H:Number):void
{
var num1:Number = 0;
var num2:Number = 0;
var num3:Number = 0;
var num4:Number = 0;
num1 = ow - W;
num2 = oh - H;
if (constraints)
{
if (Math.min(num1,num2) == num1)
{
num2 = Math.round(num1 / ratio);
}
else
{
num1 = Math.round(num2 * ratio);
}
if (num1 > sox + ow + cornerWidth / 2)
{
var num5:* = sox + ow + cornerWidth / 2;
num1 = sox + ow + cornerWidth / 2;
num2 = num5;
}
if (num2 > soy + oh + cornerWidth / 2)
{
var num6:* = soy + oh + cornerWidth / 2;
num2 = soy + oh + cornerWidth / 2;
num1 = num6;
}
}
num3 = limitedResizeWidth(num1);
num4 = limitedResizeHeight(num2);
limitedMoveX(sox + (ow - num3));
limitedMoveY(soy + (oh - num4));
_target.x = this.x;
_target.y = this.y;
return;
}
private function panelMouseOverHandler(event:MouseEvent):void
{
if (mousedown)
{
return;
}
busy = true;
MouseCursor.show(MouseCursor.MOUSE_MOVABLE);
return;
}
public function set target(obj:DisplayObject):void
{
_target = obj;
this.x = _target.x;
this.y = _target.y;
line.width = _target.width;
line.height = _target.height;
this.width = _target.width;
this.height = _target.height;
return;
}
override public function get height():Number
{
return line.height;
}
private function limitedMoveX(num:Number):Number
{
num = Math.round(Math.max(bounds.x,num));
num = Math.round(Math.min(bounds.width - this.width,num));
var num2:* = num;
super.x = num;
return num2;
}
private function panelMouseUpHandler(event:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, panelMouseUpHandler);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, panelMouseMoveHandler);
mousedown = false;
this.dispatchEvent(new Event(Event.CHANGE));
return;
}
private function limitedMoveY(num:Number):Number
{
num = Math.round(Math.max(bounds.y,num));
num = Math.round(Math.min(bounds.height - this.height,num));
var num2:* = num;
super.y = num;
return num2;
}
override public function set height(num:Number):void
{
line.height = num;
resetCorner();
return;
}
private function mouseMoveHandler(event:MouseEvent):void
{
var myx:Number = NaN;
var myy:Number = NaN;
if (mousedown)
{
myx = stage.mouseX;
myy = stage.mouseY;
resizeDir[currDir](Math.round(myx - ox),Math.round(myy - oy));
resetCorner();
}
MouseCursor.setPoint(stage.mouseX, stage.mouseY);
event.updateAfterEvent();
return;
}
private function cornerMouseOverHandler(event:MouseEvent):void
{
if (mousedown)
{
return;
}
busy = true;
MouseCursor.show(MouseCursor.MOUSE_RESIZABLE, cursorRotations[event.target.name]);
MouseCursor.setPoint(stage.mouseX, stage.mouseY);
return;
}
private function createCorner(Name:String, X:Number, Y:Number, WH:Number):Sprite
{
var corner:Sprite = null;
corner = new Sprite();
corner.name = Name;
corner.graphics.lineStyle(1, 0xFFFFFF);
corner.graphics.beginFill(0x0000FF);
corner.graphics.drawRect(X, Y, WH, WH);
corner.graphics.endFill();
corner.addEventListener(MouseEvent.MOUSE_OVER, cornerMouseOverHandler);
corner.addEventListener(MouseEvent.MOUSE_DOWN, cornerMouseDownHandler);
corner.addEventListener(MouseEvent.MOUSE_OUT, cornerMouseOutHandler);
corner.addEventListener(MouseEvent.MOUSE_UP, cornerMouseUpHandler);
line.addEventListener(MouseEvent.MOUSE_OVER, panelMouseOverHandler);
line.addEventListener(MouseEvent.MOUSE_DOWN, panelMouseDownHandler);
line.addEventListener(MouseEvent.MOUSE_OUT, panelMouseOutHandler);
line.addEventListener(MouseEvent.MOUSE_UP, panelMouseUpHandler);
return corner;
}
public function get changing():Boolean
{
return mousedown;
}
override public function get x():Number
{
return super.x + cornerWidth / 2;
}
override public function get y():Number
{
return super.y + cornerWidth / 2;
}
private function panelMouseMoveHandler(event:MouseEvent):void
{
if (mousedown)
{
limitedMoveX(sox + (stage.mouseX - ox));
limitedMoveY(soy + (stage.mouseY - oy));
_target.x = this.x;
_target.y = this.y;
}
MouseCursor.setPoint(stage.mouseX, stage.mouseY);
event.updateAfterEvent();
return;
}
private function resetCorner():void
{
corners.lt.x = Math.round(line.x - cornerWidth / 2);
corners.lt.y = Math.round(line.y - cornerWidth / 2);
corners.t.x = Math.round(line.width / 2);
corners.t.y = corners.lt.y;
corners.rt.x = corners.lt.x + line.width;
corners.rt.y = corners.lt.y;
corners.r.x = corners.rt.x;
corners.r.y = Math.round(line.height / 2);
corners.rb.x = corners.rt.x;
corners.rb.y = corners.lt.y + line.height;
corners.b.x = corners.t.x;
corners.b.y = corners.rb.y;
corners.lb.x = corners.lt.x;
corners.lb.y = corners.b.y;
corners.l.x = corners.lb.x;
corners.l.y = corners.r.y;
return;
}
private function panelMouseDownHandler(event:MouseEvent):void
{
mousedown = true;
ox = stage.mouseX;
oy = stage.mouseY;
sox = super.x;
soy = super.y;
stage.addEventListener(MouseEvent.MOUSE_UP, panelMouseUpHandler);
stage.addEventListener(MouseEvent.MOUSE_MOVE, panelMouseMoveHandler);
return;
}
private function limitedResizeWidth(W:Number):Number
{
if (W <= minWidth)
{
line.width = minWidth;
_target.width = line.width;
return minWidth;
}
if (W >= maxWidth)
{
line.width = maxWidth;
_target.width = line.width;
return maxWidth;
}
_target.width = W;
var n:Number = W;
line.width = W;
return n;
}
public function get target():DisplayObject
{
return _target;
}
override public function set width(Width:Number):void
{
line.width = Width;
resetCorner();
return;
}
private function resize_b(W:Number, H:Number):void
{
var num1:Number = NaN;
var num2:Number = NaN;
var num3:Number = NaN;
if (constraints)
{
num1 = ow;
num2 = Math.round((oh + H) / 2) * 2;
num1 = Math.round(num2 * ratio);
if (num2 + soy > bounds.height)
{
var n1:Number = bounds.height - soy;
num2 = bounds.height - soy;
num1 = n1;
}
if (num1 / 2 + (sox + ow / 2) > bounds.width)
{
var n2:Number = (bounds.width - (sox + ow / 2)) * 2;
num1 = (bounds.width - (sox + ow / 2)) * 2;
num2 = n2;
}
if (sox + ow / 2 - num1 / 2 < bounds.x)
{
var n3:Number = (sox + ow / 2 + cornerWidth / 2) * 2;
num1 = (sox + ow / 2 + cornerWidth / 2) * 2;
num2 = n3;
}
num3 = limitedResizeWidth(num1);
limitedResizeHeight(num2);
limitedMoveX(sox + (ow - num3) / 2);
_target.x = this.x;
}
else
{
limitedResizeHeight(oh + H);
}
return;
}
private function resize_l(W:Number, H:Number):void
{
var num1:Number = NaN;
var num2:Number = NaN;
var num3:Number = NaN;
var num4:Number = NaN;
if (constraints)
{
num3 = Math.round((ow - W) / 2) * 2;
num4 = oh;
num4 = Math.round(num3 * ratio);
if (num3 > sox + ow + cornerWidth / 2)
{
var n1:Number = sox + ow + cornerWidth / 2;
num3 = sox + ow + cornerWidth / 2;
num4 = n1;
}
if (num4 / 2 + (soy + oh / 2) > bounds.height)
{
var n2:Number = (bounds.height - (soy + oh / 2)) * 2;
num4 = (bounds.height - (soy + oh / 2)) * 2;
num3 = n2;
}
if (soy + oh / 2 - num4 / 2 < bounds.y)
{
var n3:Number = (soy + oh / 2 + cornerWidth / 2) * 2;
num4 = (soy + oh / 2 + cornerWidth / 2) * 2;
num3 = n3;
}
num1 = limitedResizeWidth(num3);
num2 = limitedResizeHeight(num4);
limitedMoveX(sox + (ow - num1));
limitedMoveY(soy + (oh - num2) / 2);
_target.x = this.x;
_target.y = this.y;
}
else
{
num1 = limitedResizeWidth(ow - W);
limitedMoveX(sox + (ow - num1));
_target.x = this.x;
}
return;
}
private function cornerMouseOutHandler(event:MouseEvent):void
{
if (mousedown)
{
return;
}
MouseCursor.hide();
busy = false;
event.updateAfterEvent();
return;
}
private function resize_r(W:Number, H:Number):void
{
var num1:Number = NaN;
var num2:Number = NaN;
var num3:Number = NaN;
if (constraints)
{
num1 = Math.round((ow + W) / 2) * 2;
num2 = oh;
num2 = Math.round(num1 / ratio);
if (num1 + sox > bounds.width)
{
var n1:Number = bounds.width - sox;
num1 = bounds.width - sox;
num2 = n1;
}
if (num2 / 2 + (soy + oh / 2) > bounds.height)
{
var n2:Number = (bounds.height - (soy + oh / 2)) * 2;
num2 = (bounds.height - (soy + oh / 2)) * 2;
num1 = n2;
}
if (soy + oh / 2 - num1 / 2 < bounds.y)
{
var n3:Number = (soy + oh / 2 + cornerWidth / 2) * 2;
num2 = (soy + oh / 2 + cornerWidth / 2) * 2;
num1 = n3;
}
limitedResizeWidth(num1);
num3 = limitedResizeHeight(num2);
limitedMoveY(soy + (oh - num3) / 2);
_target.y = this.y;
}
else
{
limitedResizeWidth(ow + W);
}
return;
}
private function resize_t(W:Number, H:Number):void
{
var num1:Number = 0;
var num2:Number = 0;
var num3:Number = 0;
var num4:Number = 0;
if (constraints)
{
num3 = ow;
num4 = Math.round((oh - H) / 2) * 2;
num3 = Math.round(num4 * ratio);
if (num4 > soy + oh + cornerWidth / 2)
{
var n1:Number = soy + oh + cornerWidth / 2;
num4 = soy + oh + cornerWidth / 2;
num3 = n1;
}
if (num3 / 2 + (sox + ow / 2) > bounds.width)
{
var n2:Number = (bounds.width - (sox + ow / 2)) * 2;
num3 = (bounds.width - (sox + ow / 2)) * 2;
num4 = n2;
}
if (sox + ow / 2 - num3 / 2 < bounds.x)
{
var n3:Number = (sox + ow / 2 + cornerWidth / 2) * 2;
num3 = (sox + ow / 2 + cornerWidth / 2) * 2;
num4 = n3;
}
num1 = limitedResizeWidth(num3);
num2 = limitedResizeHeight(num4);
limitedMoveX(sox + (ow - num1) / 2);
limitedMoveY(soy + (oh - num2));
_target.x = this.x;
_target.y = this.y;
}
else
{
num2 = limitedResizeHeight(oh - H);
limitedMoveY(soy + (oh - num2));
_target.y = this.y;
}
return;
}
private function resize_rt(W:Number, H:Number):void
{
var num1:Number = NaN;
var num2:Number = NaN;
var num3:Number = NaN;
num1 = ow + W;
num2 = oh - H;
if (constraints)
{
if (Math.min(num1,num2) == num1)
{
num2 = Math.round(num1 / ratio);
}
else
{
num1 = Math.round(num2 * ratio);
}
if (num2 > soy + oh + cornerWidth / 2)
{
var n1:Number = soy + oh + cornerWidth / 2;
num2 = soy + oh + cornerWidth / 2;
num1 = n1;
}
if (num1 + this.x - cornerWidth / 2 > bounds.width)
{
var n2:Number = bounds.width - this.x + cornerWidth / 2;
num1 = bounds.width - this.x + cornerWidth / 2;
num2 = n2;
}
}
limitedResizeWidth(num1);
num3 = limitedResizeHeight(num2);
limitedMoveY(soy + (oh - num3));
_target.y = this.y;
return;
}
public function set selectBounds(rectangle:Rectangle):void
{
bounds.x = rectangle.x - cornerWidth / 2;
bounds.y = rectangle.y - cornerWidth / 2;
bounds.width = rectangle.width - (cornerWidth / 2);
bounds.height = rectangle.height - (cornerWidth / 2);
return;
}
private function resize_rb(W:Number, H:Number):void
{
var num1:Number = NaN;
var num2:Number = NaN;
num1 = ow + W;
num2 = oh + H;
if (constraints)
{
if (Math.min(num1,num2) == num1)
{
num2 = Math.round(num1 / ratio);
}
else
{
num1 = Math.round(num2 * ratio);
}
if (num1 + this.x - cornerWidth / 2 > bounds.width)
{
var n1:Number = bounds.width - this.x + cornerWidth / 2;
num1 = bounds.width - this.x + cornerWidth / 2;
num2 = n1;
}
if (num2 + this.y - cornerWidth / 2 > bounds.height)
{
var n2:Number = bounds.height - this.y + cornerWidth / 2;
num2 = bounds.height - this.y + cornerWidth / 2;
num1 = n2;
}
}
limitedResizeWidth(num1);
limitedResizeHeight(num2);
return;
}
private function limitedResizeHeight(num:Number):Number
{
if (num <= minHeight)
{
line.height = minHeight;
_target.height = line.height;
return minHeight;
}
if (num >= maxHeight)
{
line.height = maxHeight;
_target.height = line.height;
return maxHeight;
}
_target.height = num;
var H:Number = num;
line.height = num;
return H;
}
override public function get width():Number
{
return line.width;
}
private function cornerMouseUpHandler(event:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, cornerMouseUpHandler);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
mousedown = false;
if (! corners[event.target.name] || ! corners[event.target.name].hitTestPoint(stage.mouseX,stage.mouseY))
{
cornerMouseOutHandler(event);
}
this.dispatchEvent(new Event(Event.CHANGE));
return;
}
private function resize_lb(W:Number, H:Number):void
{
var num:Number = NaN;
var num1:Number = NaN;
var num2:Number = NaN;
num = ow - W;
num1 = oh + H;
if (constraints)
{
if (Math.min(num,num1) == num)
{
num1 = Math.round(num / ratio);
}
else
{
num = Math.round(num1 * ratio);
}
if (num > sox + ow + cornerWidth / 2)
{
var num3:* = sox + ow + cornerWidth / 2;
num = sox + ow + cornerWidth / 2;
num1 = num3;
}
if (num1 + this.y - cornerWidth / 2 > bounds.height)
{
var num4:* = bounds.height - this.y + cornerWidth / 2;
num1 = bounds.height - this.y + cornerWidth / 2;
num = num4;
}
}
num2 = limitedResizeWidth(num);
limitedResizeHeight(num1);
limitedMoveX(sox + (ow - num2));
_target.x = this.x;
return;
}
override public function set x(num:Number):void
{
super.x = num - cornerWidth / 2;
return;
}
override public function set y(num:Number):void
{
super.y = num - cornerWidth / 2;
return;
}
private function cornerMouseDownHandler(event:MouseEvent):void
{
mousedown = true;
ox = stage.mouseX;
oy = stage.mouseY;
ow = line.width;
oh = line.height;
sox = super.x;
soy = super.y;
rox = event.target.mouseX;
roy = event.target.mouseY;
this.setChildIndex(event.target as DisplayObject, (this.numChildren - 1));
currDir = event.target.name;
stage.addEventListener(MouseEvent.MOUSE_UP, cornerMouseUpHandler);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
return;
}
private function panelMouseOutHandler(event:MouseEvent):void
{
if (mousedown)
{
return;
}
MouseCursor.hide();
busy = false;
return;
}
}
}
其中还用到一些第三方类库:greensock、json、图像编码等...,最后是后台的一些脚本和页面:
saveImage.asp
<%
dim strSaveFileName
dim strNow
strnow =replace(replace(replace(now(), ":", ""), "-", ""), " ", "")
if request.servervariables("REQUEST_METHOD")="POST" then '当前为post
FormSize=Request.TotalBytes
FormData=Request.BinaryRead(FormSize) '接收数据到FormData
strSaveFileName =strNow &".png"
set dr=CreateObject("Adodb.Stream")
dr.Mode=3
dr.Type=1
dr.Open
dr.Write(FormData)
dr.SaveToFile Server.MapPath(strSaveFileName),2
dr.Close
set dr=nothing
response.Write(strSaveFileName)
end if
%>
仅供参考!
