我有flex mxml自定义组件(Graphic)。根据要求需要将它们复制为copy或cut operation.but 问题在registerClassAlias()方法中,它如何用于自定义图形或组(或UIComponents)组件。
var className:String = getQualifiedClassName(zorder.getItemAt(0));
_saveIn.clear();
registerClassAlias(className, zorder.getItemAt(0) as Class);
_saveIn = SharedObject.getLocal("save");
_saveIn.data.value1 = new ByteArray();
_saveIn.data.value1.writeObject(zorder.getItemAt(0));
_saveIn.data.value1.position = 0;
_saveIn.flush();
答案 0 :(得分:2)
使用registerClassAlias->writeObject->readObject
方法通过ByteArray制作任何显示对象的完整副本是不可能的。它仅适用于简单对象,例如数据对象(如TextFormat,值对象等)。在任何情况下,您都必须为每种类型的对象测试复制方法,以确保它正常工作。
应对Shape
的示例,最简单的显示对象:
package
{
import avmplus.getQualifiedClassName;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Shape;
import flash.net.registerClassAlias;
import flash.utils.ByteArray;
import flash.utils.getDefinitionByName;
public class astest extends MovieClip
{
public function astest()
{
init();
}
private function init():void
{
var sh:Shape = new Shape();
sh.graphics.beginFill(0xFF0000);
sh.graphics.drawEllipse(100, 100, 100, 70);
sh.graphics.endFill();
addChild(sh);
registerObject(sh);
var ba:ByteArray = new ByteArray();
ba.writeObject(sh);
ba.position = 0;
var obj:Object = ba.readObject();
var shCopy:DisplayObject = obj as DisplayObject;
if(shCopy)
{
shCopy.x = shCopy.y = 100;
addChild(shCopy);
}
}
private function registerObject(obj:Object):void
{
try
{
var qname:String = getQualifiedClassName(obj);
var cname:String = qname.split("::").join(".");
var classs:Class = getDefinitionByName(cname) as Class;
registerClassAlias(qname, classs);
}catch(error:Error)
{
trace(error.message);
}
}
}
}
输出:
TypeError: Error #1034: Type Coercion failed: cannot convert Object@eae09b9 to flash.geom.Transform.
因此,您可以尝试在应对前注册flash.geom.Transform
:
registerObject(sh.transform);
但这会导致另一个错误:
ArgumentError: Error #1063: Argument count mismatch on flash.geom::Transform(). Expected 1, got 0
实际上,DisplayObject
应对是一个老话题,你可以通过我上面提到的错误(特别是最后一个)谷歌搜索大量关于此的帖子,但答案是:你无法复制在via ByteArray中显示对象,您需要编写自定义方法来创建给定TextField,Sprite或VBox的副本并手动复制所有属性。
答案 1 :(得分:0)
好的,这个blog post有一个简单的解决方案......你使用getDefinitionByName()
:
在你的代码中有这样的东西:
var className:String = getQualifiedClassName(zorder.getItemAt(0));
_saveIn.clear();
registerClassAlias(className, getDefinitionByName(className) as Class);
_saveIn = SharedObject.getLocal("save");
_saveIn.data.value1 = new ByteArray();
_saveIn.data.value1.writeObject(zorder.getItemAt(0));
_saveIn.data.value1.position = 0;
_saveIn.flush();