actionscript-3 – 如何为自定义mxml组件工作registerClassAlias()方法

前端之家收集整理的这篇文章主要介绍了actionscript-3 – 如何为自定义mxml组件工作registerClassAlias()方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有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的副本的自定义方法,并手动复制所有属性.

猜你在找的Flex相关文章