as3的影片实例不再有duplicateMovieClip的方法,它建议你使用显示对象的类来创建一个新的实例,但是这和duplicateMovieClip不同,和attachMovie比较相象,为了能更好的在as3里使用duplicateMovieClip,可以考虑下面的函数
从上面可以看出,这个函数保留了复制实例的全部信息(比如transformation, filters, chaching as bitmap等)。
提示:flash player 9有个bug,他不能正确的返回显示对象的scale9Grid 属性。
使用:
这个函数无法复制使用画图函数生成的信息。通常显示对象的画图对象不能被复制,所以这个函数也没有办法复制显示对象的画图对象。
译自ActionScript 3 Tip of the Day
原文地址:http://www.kirupa.com/forum/showthread.php?p=1939827#post1939827
package com.senocular.display { import flash.display.DisplayObject; import flash.geom.Rectangle; /** * duplicateDisplayObject * creates a duplicate of the DisplayObject passed. * similar to duplicateMovieClip in AVM1 * @param target the display object to duplicate * @param autoAdd if true, adds the duplicate to the display list * in which target was located * @return a duplicate instance of target */ public function duplicateDisplayObject(target:DisplayObject, autoAdd:Boolean = false):DisplayObject { // create duplicate (constructor in quotes to bypass strict mode) var targetClass:Class = target["constructor"]; //或者 var targetClass:Class = Object(target).constructor; package com.senocular.display { import flash.display.DisplayObject; import flash.geom.Rectangle; /** * duplicateDisplayObject * creates a duplicate of the DisplayObject passed. * similar to duplicateMovieClip in AVM1 * @param target the display object to duplicate * @param autoAdd if true, adds the duplicate to the display list * in which target was located * @return a duplicate instance of target */ public function duplicateDisplayObject(target:DisplayObject, autoAdd:Boolean = false):DisplayObject { // create duplicate (constructor in quotes to bypass strict mode) var targetClass:Class = target["constructor"]; //或者 var targetClass:Class = Object(target).constructor;
//以上两种写法均返回一份类定义对象的引用,我们可以直接通过这个引用来创建类的实例,如下: var duplicate:DisplayObject = new targetClass();
// duplicate properties duplicate.transform = target.transform; duplicate.filters = target.filters; duplicate.cacheAsBitmap = target.cacheAsBitmap; duplicate.opaqueBackground = target.opaqueBackground; if (target.scale9Grid) { var rect:Rectangle = target.scale9Grid; // Flash 9 bug where returned scale9Grid is 20x larger than assigned rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20; duplicate.scale9Grid = rect; } // add to target parent's display list // if autoAdd was provided as true if (autoAdd && target.parent) { target.parent.addChild(duplicate); } return duplicate; } }
提示:flash player 9有个bug,他不能正确的返回显示对象的scale9Grid 属性。
使用:
import com.senocular.display.duplicateDisplayObject;
// create duplicate and assign to newInstance variable
// using true for autoAdd automatically adds the newInstance
// into the display list where myOldSprite is located
var newInstance:Sprite = duplicateDisplayObject(myOldSprite, true);
newInstance.x += 100; // shift to see duplicate
译自ActionScript 3 Tip of the Day
原文地址:http://www.kirupa.com/forum/showthread.php?p=1939827#post1939827