自己编写克隆函数

因为flex不提供UIComponent对象的克隆函数,只提供非可视化对象的克隆函数(利用ObjectUtil),因此当我们要克隆一个可视化对象的时候,就不得不自己提供克隆函数了。

/**
		 * 该函数提供了克隆一个Renderer组件。克隆属性,克隆孩子。<br>克隆属性的时候,不克隆属性组件引用,克隆基本类型,以及数组。</br> 
		 * @return 
		 * 
		 */
		public function clone():Renderer{
			var className:String = getQualifiedClassName(this);
			var RendererObject:Object = getDefinitionByName(className);
			var cloneRenderer:Renderer  = new RendererObject();
			
			cloneProperties(this,cloneRenderer);
			cloneStyle(this,cloneRenderer);
			return cloneRenderer;
		}
		
		/**
		 * 克隆属性。 
		 * @param renderer
		 * @param cloneRenderer
		 * 
		 */
		protected function cloneProperties(renderer:Renderer, cloneRenderer:Renderer):void
		{
			var prop:Object;
			if (!(renderer == null) && !(cloneRenderer == null)) 
			{
				//克隆x和y坐标。
				setX(cloneRenderer, getX(renderer));
				setY(cloneRenderer, getY(renderer));
				
				cloneRenderer.explicitWidth = renderer.explicitWidth;
				cloneRenderer.explicitHeight = renderer.explicitHeight;
				cloneRenderer.percentWidth = renderer.percentWidth;
				cloneRenderer.percentHeight = renderer.percentHeight;
				cloneRenderer.explicitMinWidth = renderer.explicitMinWidth;
				cloneRenderer.explicitMinHeight = renderer.explicitMinHeight;
				cloneRenderer.explicitMaxWidth = renderer.explicitMaxWidth;
				cloneRenderer.explicitMaxHeight = renderer.explicitMaxHeight;
			}
			
			if (rendererProperties == null) 
			{
				rendererProperties = new Array();
				var properties:Array = ObjectUtil.getClassInfo(new Renderer())["properties"];
				
				for each ( prop in properties) 
				{
					rendererProperties.push(prop.localName);
				}
			}
			var options:Object;
			(options = new Object())["includeReadOnly"] = false;
			var classInfo:Object = ObjectUtil.getClassInfo(renderer, rendererProperties, options);
			var cloneProperties:Array = classInfo["properties"];
			
			for each (prop in cloneProperties) 
			{
				trace(prop.localName);
				var p:Object = renderer[prop.localName];
				if(p is int || p is Number || p is String || p is Boolean ){
					cloneRenderer[prop.localName] = p;
				}/*else if(p is Object){
					cloneRenderer[prop.localName] = ObjectUtil.clone(p);
				}*/
			}
			
		}
		
		internal function getX(renderer:Renderer):Number
		{
			var result:Number=NaN;
			if (renderer.left is Number) 
			{
				result = Number(renderer.left);
				if (!isNaN(result)) 
				{
					return result;
				}
			}
			return renderer.x;
		}
		
		internal function setX(renderer:Renderer, x:Number):void
		{
			if (renderer.left is Number && !isNaN(Number(renderer.left))) 
			{
				renderer.left = x;
			}
			else 
			{
				renderer.x = x;
			}
			return;
		}
		
		internal function getY(renderer:Renderer):Number
		{
			var result:Number=NaN;
			if (renderer.top is Number) 
			{
				result = Number(renderer.top);
				if (!isNaN(result)) 
				{
					return result;
				}
			}
			return renderer.y;
		}
		
		internal function setY(renderer:Renderer, y:Number):void
		{
			if (renderer.top is Number && !isNaN(Number(renderer.top))) 
			{
				renderer.top = y;
			}
			else 
			{
				renderer.y = y;
			}
			return;
		}


克隆容器

override public function clone():Renderer{
			var cloneRenderer:Renderer = super.clone();
			cloneChildren(this, cloneRenderer);
			return cloneRenderer;
		}
		
		/**
		 * 克隆孩子。 
		 * @param renderer
		 * @param cloneRenderer
		 * 
		 */
		internal function cloneChildren(renderer:Renderer, cloneRenderer:Renderer):void{
			var length:int=0;
			var ele:Renderer=null;
			var clo:Renderer=null;
			var subGraph:SubGraph = renderer as SubGraph;
			if (subGraph != null) 
			{
				var i:int = 0;
				length = subGraph.numElements;
				while (i < length) 
				{
					ele = subGraph.getElementAt(i) as Renderer;
					if (ele) 
					{
						clo = ele.clone();
						SubGraph(cloneRenderer).addElement(clo);
						cloneChildren(ele, clo);
					}
					i++;
				}
			}
			return;
		}


 克隆风格:

protected function cloneStyle(renderer:Renderer, cloneRenderer:Renderer):void
		{
//			cloneRenderer.setStyle("adornerClass",renderer.getStyle("adornerClass"));
			// 利用这个工具来查找style.
			var describe:* = describeType(renderer);
			var objectMetadata:* = describe.metadata;
			var styleProp:XMLList = objectMetadata.(@name=="Style").arg.(@key=="name");
			for each (var xml:XML in styleProp) 
			{
				cloneRenderer.setStyle(xml.@value,renderer.getStyle(xml.@value));
			}
		}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值