复制显示对象通用函数

as3的影片实例不再有duplicateMovieClip的方法,它建议你使用显示对象的类来创建一个新的实例,但是这和duplicateMovieClip不同,和attachMovie比较相象,为了能更好的在as3里使用duplicateMovieClip,可以考虑下面的函数

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;  
  
    }  
  
}  



从上面可以看出,这个函数保留了复制实例的全部信息(比如transformation, filters, chaching as bitmap等)。

提示: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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值