Graphics.copyFrom 复制显示对象

发表评论 阅读评论

Graphics.copyFrom 这个API是从flash player10开始有的,以前我们要复制一个显示对象,那是不可以的,当然你可以说用 BitmapData.draw 这个方法,但是原本是矢量对象,被draw之后就变成了位图.这样不是很好的.flashplayer10刚出来的时候有关注过一些新特性,但是对这个没有这么在意.

今天在群里有人问深度复制的问题.我一开始还以为是数据的深度复制呢,就想把《AS 对象 深度复制》发给他,后一看是说显示对象的,大家都知道显示对象是不好复制的,必须得在特定的情况下,使用特定的方法来实现,而且限制多多,并不通用,甚至不可用.就比如上面有提到的用BitmapData.draw方法,而他的限制是生成的显示对象是位图.

OK,当然在Graphics.copyFrom方法出来后,又多了一条复制显示对象为矢量对象的途径,但是这个也是有限制的.

  1. 只能对MovieClip,Sprite,Shape这3种对象进行复制,而对于SimpleButton却无能为力.
  2. 只能对用AS代码绘制的部分绘制,而对在Flash 创作工具(Flash CS3,4,5等)里画的图形无能为力.
  3. 对于MovieClip的多帧不起作用.(原理请看第2条限制)

虽然说有这么多限制,但是依然可以做些简单的是复制。

function displayClone(display:DisplayObject):DisplayObject
{
    // Shape 返回 Shape
    if(display is Shape)
    {
        var shape:Shape = new Shape();
        shape.graphics.copyFrom(shape.graphics);
        return shape;
    }
    // Sprite, MovieClip 都返回Sprite
    else if(display is Sprite)
    {
        var sp:Sprite = new Sprite();
        sp.graphics.copyFrom(Sprite(display).graphics);
        var len:int = Sprite(display).numChildren;
        for(var i:int = 0; i < len; i++)
        {
            var d:DisplayObject = displayClone(Sprite(display).getChildAt(i));
            if(d) sp.addChild(d);
        }
        return sp;
    }
    return null;
}

  1. 朵未 | | #1

    你写的日志太专业了。外行人看不懂啊。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部