因为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));
}
}