代码如下:
/*
库中图片,类:Jpg
如没有容器(cutImage第7参数为null)并设置可以拖拽,监听器为stage全局监听,屏幕上所有sprite类型对象都可拖拽,
如写为非文档类,须传入stage
function cutImage (
photoName :BitmapData , ....................位图数据
numX :uint = 0 , ...................横切刀数
numY :uint = 0 , ...................纵切刀数
apary :Number = 0 , ....................切割后图片间距
type :String = "sprite" , .............切割后产生图像的类型,只支持产生 bitmap 、shape 、sprite 图像
isDrag :Boolean = false , .............拖拽
container :DisplayObjectContainer = null....容器
)
*/
var _stage = stage;
//如没有容器(cutImage第7参数为null)并设置可以拖拽,监听器为stage,如写为非文档类,须传入stage
init ();
function init ()
{
var jpg :Jpg = new Jpg( 0 , 0 );
var bmd :BitmapData = new Bitmap( jpg ) .bitmapData;
cutImage ( bmd , 3 , 3 , 1 , "sprite" , true , null );
//只有最后产生图像为sprite类型才可以用监听拖拽
}
function cutImage ( photoName :BitmapData , numX:uint = 0 , numY:uint = 0 , apart :Number = 0 , type :String = "sprite" , isDrag :Boolean = false , container :DisplayObjectContainer = null )
{
//位图数据,横切刀数,纵切刀数,切割后图片间距,切割后产生图像的类型,容器
if ( type != "shape" && type != "sprite" && type != "bitmap" )
{
trace ("错误,只支持产生 bitmap 、shape 、sprite 图像。");
return;
}
if ( type != "sprite" && isDrag )
{
trace ("错误,如果需要拖拽,请将 type(5)参数写为“sprite”。");
return;
}
if (container != null )
{
addChild (container);
}
var _width :Number = photoName .width / ( numX + 1 );
var _height :Number = photoName .height / ( numY + 1 );
//平均切割图片,计算图片高宽
if ( _width < 5 || _height < 5 )
{
trace (_width ,_height ,"切图过碎,请勿小于 5 * 5 像素面积,会导致“无法获取资源”");
return;
}
var arrXY :Array = new Array();//每张被切割图片坐标数组
var counter :uint = 0;//计数器
for (var j : uint = 0; j < ( numX + 1 ); j++)
{
for (var k : uint = 0; k < ( numY + 1 ); k++)
{
arrXY[counter] = [ j * _width , k * _height ] ;
counter++;
}
}
var array :Array =new Array();//存储切割后每张图片数据的数组
for (var i : uint = 0; i < ( numX + 1 ) * ( numY + 1 ); i++)
{
//按参数5设定类型切割图片
var bitmapData :BitmapData = new BitmapData( _width , _height );
var matrix :Matrix = new Matrix( 1 , 0 , 0 , 1 , -arrXY[i][0] , -arrXY[i][1] );
var photoType :*;
bitmapData.draw ( photoName ,matrix );
if ( type == "bitmap" )
{
photoType = new Bitmap( bitmapData );
}
if ( type == "sprite" )
{
photoType = new Sprite();
photoType.graphics.beginBitmapFill ( bitmapData );
photoType.graphics.drawRect ( 0 , 0 , _width , _height);
}
if ( type == "shape" )
{
photoType = new Shape();
photoType.graphics.beginBitmapFill ( bitmapData );
photoType.graphics.drawRect ( 0 , 0 , _width , _height );
}
array.push (photoType);
}
counter = 0;
for (var m : uint = 0; m < numX + 1; m++)
{
for (var n : uint = 0; n < numY + 1; n++)
{
//显示图片
if (container != null )
{
container.addChild (array[counter]);
}
else
{
addChild (array[counter]);
}
array[counter].x = m * (_width + apart);
array[counter].y = n * (_height + apart);
counter++;
}
}
if (isDrag)
{
//拖拽
(container != null ) ? listenerDrag ( container ) : listenerDrag ();
}
}
function listenerDrag ( container :DisplayObjectContainer = null )
{
//拖拽监听
var containerObject:DisplayObjectContainer;
containerObject = ( container == null ) ? _stage : container;
containerObject.addEventListener ( MouseEvent.MOUSE_DOWN , startDragItem );
containerObject.addEventListener ( MouseEvent.MOUSE_UP , stopDragItem );
function startDragItem (e:Event)
{
trace (e.target);
if (String(describeType(e.target).@name) == "flash.display::Sprite")
{
var mc :Sprite = e.target as Sprite;
//设置深度最高为目前被拖拽对象
if ( container != null )
{
containerObject.setChildIndex ( mc , containerObject.numChildren -1 );
}
else
{
setChildIndex ( mc , numChildren - 1 );
//stage只是全局监听器,切割后的图片并没有用stage做容器,没有前缀
}
e.target.startDrag ();
}
}
function stopDragItem (e:Event)
{
//停止拖拽
if (String(describeType(e.target).@name) == "flash.display::Sprite")
{
e.target.stopDrag ();
}
}
}