如何工作的自定义MXML组件registerClassAlias()方法(how to work r

2019-07-18 22:07发布

我有。根据要求,需要将它们复制为复制或registerClassAlias削减operation.but 问题()方法,将如何自定义图形或组(或UIComponents的)组件的 Flex MXML自定义组件(图形)。

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();

Answer 1:

它不可能使通过的ByteArray任何显示对象的完整副本registerClassAlias->writeObject->readObject方法。 它仅适用于简单对象,例如数据对象(如的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应对是老话题,你可以谷歌很多关于这个职位通过我上面(特别是最后一个)中提到的错误,但得到的答复是: 你不能复制显示器通过的ByteArray对象中,你需要写手动创建文本字段给出,雪碧或垂直框的副本,并复制所有属性自定义方法。



Answer 2:

好吧,这个博客帖子有一个简单的解决方案...您使用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();


文章来源: how to work registerClassAlias() method for custom mxml components