我有flex mxml自定义组件(Graphic).根据要求需要将它们复制为copy或cut操作.但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();
解决方法
使用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,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 coping是一个老话题,你可以通过我上面提到的错误(特别是最后一个)谷歌搜索关于这个的很多帖子,但答案是:你不能在via ByteArray中复制显示对象,你需要写用于创建给定TextField,Sprite或VBox的副本的自定义方法,并手动复制所有属性.